Android BitmapFactory.decodeResource nimmt zu viel Speicher
Ich habe eine Frage zum laden von Bitmap aus den Ressourcen. Mein code:
public void onClick(View view) {
if (mainButton == view) {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
}
}
Den test.jpg die Bildauflösung ist 3288 x 4936px. Es ist im jpeg-Format (3,9 MB /48,7 MB, wenn unkomprimiert). Während diese Funktion der Arbeit (auf meinem Nexus 7 2013 Gerät), folgende Ausnahme tritt auf:
java.lang.OutOfMemoryError: Failed to allocate a 259673100 byte allocation with 5222644 free bytes and 184MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:467)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:497)
at pl.jaskol.androidtest.MainActivity.onClick(MainActivity.java:50)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Warum die Anwendung versucht, zu reservieren, so viel wie 248MB?
Ich schrieb eine ähnliche Anwendung in Qt für Android mit dem gleichen Bild in Ressourcen und es funktioniert OK.
EDIT:
-
Kann ich nicht die Größe ändern.
-
Dies ist sehr einfache Anwendung, wie Hallo Welt. Es macht nichts anderes, nur geladen bitmap aus den Ressourcen.
EDIT2:
Jim ' s Lösung funktioniert bei mir. Aber es gibt ein anderes problem. Nach dem laden von Bitmaps ist es 4 mal zu groß (2 mal Höhe und 2 mal Breite). Ich habe versucht, verschiedene Bilder, darunter neue Bild erstellt, in Pinta oder Gimp.
- Versuchen Sie die Anwendung einige
Options
auf Sie zu ändern die Größe der Stichprobe bei der Erzeugung der bitmap. - versuchen
resizing
es - Gut, dass die Bild - "nur" muss über mindestens 64 MB (die nicht fast jedes Handy sowieso). Sie müssen mit viel mehr Speicher woanders. Bitte fügen Sie den entsprechenden code. Interessanterweise ist die Speicheranforderung gescheitert ist, für genau 4 mal die bitmap.
- Ich kann nicht die Größe ändern. Ich habe, um es zu ändern und zu speichern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
android:largeHeap="true"
auf Ihre Bewerbung-tag in derAndroidManifest.xml
- Datei zu gehen über die64MB
begrenzen. Das klappt nicht aufpre 3.0
Geräte.Dass könnte dein problem lösen mit der rechten gibt. Wenn das noch nicht genug ist, können Sie laden Sie das bitmap mit native code, wo Ihr heap-limit ist der Speicher voll ist auf dem Gerät. Die
NDK
ist mehr beteiligt, so versuchen, die oben genannten Lösung zuerst.OK, ich habe mich entschlossen mein problem in zwei Schritten:
1) Nach Jim ' s Antwort habe ich Hinzugefügt
auf meiner application-tag in der
AndroidManifest.xml
Datei.2) das Bild wurde automatisch verkleinert wegen der hohen
DPI
der Bildschirm auf meinem Gerät. Um dies zu vermeiden, so musste ich inScaled option false:Danke für all Eure Antworten.
Werfen Sie einen Blick auf diese Ressource: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
Besonders
decodeSampledBitmapFromResource
Methode.