Bilder, die zu AnimationDrawable hinzugefügt wurden, haben programmatisch Speicherverlust

9

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:

  1. Aufruf von Recycle auf jedem der Frames, nachdem ich mit der aktuellen Animation fertig bin, aber es scheint nicht zu helfen.
  2. Dem AnimationDrawble-Objekt null zuweisen
  3. Sicherstellen, dass keine statische Variable in Bezug auf die Klasse vorhanden ist, die den Verweis auf die animierte Zeichnungsdatei enthält
  4. Stellen Sie sicher, dass das Problem verschwindet, sobald ich den Kommentar auskommen lasse myAnimation.addFrame(...)
Gu1234 05.10.2011, 08:52
quelle

2 Antworten

0

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/)

    
Justin Breitfeller 06.10.2011 14:19
quelle
0

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.

%Vor%     
PiyushMishra 30.06.2013 06:53
quelle

Tags und Links