Ich habe eine Android App mit vielen Animationen.
Wenn ich programmatisch Animationen (mit AnimationDrawable
) erstelle, wächst das non-java-Objekt (wie auf der DDMS-Registerkarte Heap) mit jeder neuen Animation, die ich lade und nie zurückschrumpft, auch nachdem meine Animationen ankommen freigegeben.
Ich habe nur einen Verweis auf jedes AnimationDrawable
-Objekt von einem Wrapper-Objekt, das ich geschrieben habe, und ich habe verifiziert, dass dieses Objekt durch Überschreiben der finalize
-Methode freigegeben wird und dafür sorgt, dass es aufgerufen wird.
Irgendwann beendet android das Laden von Bildern und druckt "out of memory" Fehler in das Protokoll.
Das Interessante ist, dass dies nur bei einigen Geräten (Motorola Xoom, Sony Experia) und nicht bei anderen (wie dem Galaxy S) passiert.
Dieses Problem ist nicht spezifisch für Honeycomb oder Pre-Honeycomb, wie Sie an den Beispielbeispielen sehen können.
Einige der Dinge, die ich versuchte:
myAnimation.addFrame(...)
Dies ist keine exakte Antwort, sondern ein hilfreicher Hinweis, um herauszufinden, wo genau das Leck auftritt. Führen Sie einen Heap-Dump aus, nachdem Sie erwartet haben, dass Ihr Speicher zurückgewonnen wird, und sehen Sie, warum die Objekte, von denen Sie glauben, dass sie tot sind, noch am Leben sind.
Stellen Sie sicher, dass Sie das Speicheranalyse-Tool für Eclipse erhalten. (http://www.eclipse.org/mat/)
Es kann zwei mögliche Ursachen geben, zum einen beim Erstellen der Bitmap und zweitens, wenn Sie die Bitmap in BitmapDrawable konvertieren. Wie ich aus Ihrem Kommentar (new BitmapDrawable(currentFrameBitmap)
sehen kann, ist diese Methode jetzt besser geeignet, um BitmapDrawable(getResources(),currentFrameBitmap)
zu verwenden. Ohne die Resources-Referenz wird die Bitmap möglicherweise nicht richtig dargestellt, selbst wenn sie korrekt skaliert wurde. Um Bitmap effizient zu laden, können Sie es richtig skalieren.
Tags und Links memory-leaks android