Android: Out of memory Fehler
Wenn ich minimieren meine Android-App für etwa 4 oder 5 mal, ich bekomme immer die folgende Fehlermeldung:
02-01 19:24:11.980: E/dalvikvm-heap(22362): Out of memory on a 3686416-byte allocation.
02-01 19:24:12.000: E/dalvikvm(22362): Out of memory: Heap Size=62755KB, Allocated=55237KB, Limit=65536KB
02-01 19:24:12.000: E/dalvikvm(22362): Extra info: Footprint=62435KB, Allowed Footprint=62755KB, Trimmed=2144KB
02-01 19:24:12.000: E/Bitmap_JNI(22362): Create Bitmap Failed.
02-01 19:24:12.000: E/Bitmap_JNI(22362): Failed to create SkBitmap!
02-01 19:24:12.000: E/AndroidRuntime(22362): FATAL EXCEPTION: main
02-01 19:24:12.000: E/AndroidRuntime(22362): java.lang.OutOfMemoryError: (Heap Size=62755KB, Allocated=55237KB)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.nativeCreateScaledBitmap(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:744)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.Utils.getResizedBitmap(Utils.java:56)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.MenuView.initialize(MenuView.java:74)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.MenuView$1.handleMessage(MenuView.java:137)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.os.Looper.loop(Looper.java:156)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.app.ActivityThread.main(ActivityThread.java:5045)
02-01 19:24:12.000: E/AndroidRuntime(22362): at java.lang.reflect.Method.invokeNative(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362): at java.lang.reflect.Method.invoke(Method.java:511)
02-01 19:24:12.000: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-01 19:24:12.000: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-01 19:24:12.000: E/AndroidRuntime(22362): at dalvik.system.NativeStart.main(Native Method)
Meine App besteht nur aus einer Aktivität, die hat 7 verschiedene, selbst geschriebene Ansichten (alle von Ihnen enthalten einige Bitmaps) in es, und Sie werden ein-und ausgeschaltet unsichtbar, wenn Sie nicht benötigt werden (Wahrscheinlich kein guter Stil, aber es funktionierte für mich bis jetzt...). Jede dieser Ansichten hat eine destroy()-Funktion, die recycelt alle Bitmaps verwendet werden, und die onDestroy() in der MainActivity fordert alle diejenigen, die destroy()-Funktionen. Darüber hinaus habe ich keine statischen Bitmaps.
Also, gibt es etwas, was ich versuchen könnte neben dem recycling alle Bitmaps und nicht mit statischen Bitmaps?
InformationsquelleAutor vauge | 2013-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut. Bitmaps auf Android kann ein wenig knifflig. Können Sie geben besser Auskunft über die Quellen der bitmaps und Ihre Größen?
Ansonsten würde ich empfehlen, sich in diese Dinge:
Wenn Sie laden von remote-Bildern, check-out fresco. Sie können auch check out Picasso. Ich persönlich verwendet wie ImageLoader, aber es wird nicht mehr gepflegt.
Wenn Sie mit der inPurgable flag, das verwendet werden, um eine empfohlene option, versuchen Sie einen Weg zu finden, um ihn herum, wie es tatsächlich bewirkt, dass mehr Speicher zugewiesen werden, für jedes Bild.
Wenn Sie decodieren kleine, lokale Vermögenswerte oft, sparen Sie Ihre drawables in eine hashmap und überarbeiten diese bei Bedarf. Weniger GC.
Wenn Sie kümmern sich um eine Unterklasse Ihrer Anwendung verwenden, können Sie die OnLowMemory nennen, um zu wissen, wenn Sie wahrscheinlich wirklich Aufräumen müssen (meist gut für debugging, nicht der realen Lebenssituation) ... Wenn das nicht zu spät ist... 🙂
Werfen Sie einen Blick auf Chris Dämonen " - blog. Diese ist eine ziemlich interessante cache-Speicher-Lösung
Implementierung eines Speicher-trimmer, Ruf Sie an, Wann immer es nötig und möglich ist.
Einer anderen nicht überraschend ist die Optimierung auf kleinere Objekte, wenn Sie können... Denken Sie an Ihre minimalen Daten-Modelle-und Bildformate, und versuchen Sie, eine konforme API für diejenigen.
InformationsquelleAutor Ben Max Rubinstein
#3 von Ben Max Kommentar, den ich haben für Euch zwei nützliche Klassen:
und
kann verwendet werden, wie:
InformationsquelleAutor Fedir Tsapana
Stellen Sie sicher, dass Sie laden Sie in
onCreate()
und nicht inonStart()
oderonResume()
. Es klingt so, als ob Sie neu geladen jedes mal, wenn Sie fortsetzen, aber Sie werden auch nicht zerstört, weilonDestroy()
ist nicht aufgerufen, wenn Sie minimieren der app.Sind Sie sicher, dass
onDestroy()
wird aufgerufen, wenn Sie das Telefon gesperrt? So oder so, es sollte keine Rolle spielen, wenn Sie nur so dass Sie inonCreate()
. Die einzige andere Sache, die ich denken kann, ist, um ein Protokoll zu drucken, fordertisRecycled()
auf jede bitmap um sicherzustellen, dass Sie tatsächlich recycelt.InformationsquelleAutor Tim
Wenn die Bilder auf dem lokalen Gerät (d.h. entweder integriert mit Ihrem code oder kommen aus dem Benutzer-Bild-Bibliothek), dann kann ich wählen, NICHT zu haben, gehen Sie einfach unsichtbar oder nicht, sondern bringen Sie Sie in on-the-fly von der Festplatte. Wie es sich herausstellt, sind alle diese Geräte sind im wesentlichen flash-basiert, was ist extrem schnell im Vergleich zu Spindel-Festplatten. Die meisten wahrscheinlich, wird der Benutzer nicht in der Lage zu fühlen, die Leistung Treffer von disk-IO für die Bilder.
diese Weise auch, begrenzen Sie die MENGE der Bilder, die Ihr halten im Speicher zu einem beliebigen Zeitpunkt.
Ich Stimme zu, die Sie in Aussehen sollte Tim' Bewertung auch.
InformationsquelleAutor trumpetlicks