Animation Drawable verursacht OutOfMemoryError beim zweiten Lauf in Android

8

Ich entwickle gerade ein Spiel und versuche mit einem AnimationDrawable eine Animation in meinem Hauptmenü anzuzeigen. Wenn ich das Spiel einmal ausführe, funktioniert es perfekt. Aber wenn ich auf den Zurück-Knopf tippe, wenn ich das Spiel wieder öffne, bekomme ich OutOfMemorryError. Wenn ich nach Hause komme und zum Spiel zurückgehe, lädt es, aber zeigt die Animation nicht, es ist leer, wo es sein sollte.

Ich denke, wenn es das Spiel wieder öffnet, versucht es, die Animation zu laden, aber es ist bereits aus dem vorherigen Lauf geladen, kann ich diesen Speicher irgendwie befreien? Wie kann ich diese Ausnahme behandeln?

Durch die Suche kann ich herausfinden, dass dies ein häufiges Problem in Android ist, aber ich konnte nichts Nützliches finden.

Wenn es relevant ist, sind meine Bilder 310x316 und ich habe 114 Frames zu laden, die Animation wird in ein xml geladen.

Meine MainMenu-Klasse:

%Vor%

Das Fehlerprotokoll:

%Vor%

Bearbeiten:

Nach dem Vorschlag von @OleGG und jetzt geht der zweite Lauf gut, aber beim dritten Lauf versuche ich anscheinend, eine recycelte Bitmap zu verwenden.

Also habe ich die Verwendung von AnimationDrawable aufgegeben und AsncTask verwendet, um mein Problem zu lösen. Jetzt ändere ich den Hintergrund des ImageView auf meinem onProgressUpdate (). Vielleicht nicht der beste Ansatz, aber jetzt habe ich keine Probleme! Hier ist mein AsyncTask-Code, falls jemand das gleiche Problem hat!

%Vor%     
caiocpricci2 31.01.2012, 15:30
quelle

5 Antworten

21

Sie müssen den Speicher freigeben, der von Bitmaps verwendet wird, wenn Sie diesen Bildschirm verlassen. Leider für frühere Versionen von Android (afaik das war seit 3.0 "behoben", aber ich kann falsch liegen) Speicher für Bitmaps wird durch nativen Code zugewiesen und, was traurig ist, sollte Speicher explizit freigegeben werden.

Also, ich nehme an, Sie versuchen diesen Ansatz:

  1. Verschieben Sie den Code für AnimationDrawable in die onResume () -Methode.
  2. Fügen Sie folgenden Code für die Freigabe von Speicher auf onPause () hinzu.

    %Vor%

Ich hoffe, es wird dir helfen.

    
OleGG 31.01.2012, 16:32
quelle
3

So schaffe ich es, mein Problem mit diesem Ansatz zu lösen:

Erstellt eine AsyncTask zum Zeichnen

%Vor%

und starten Sie es auf WindowsFocusChanged

%Vor%

Hoffe es hilft jemandem!

    
caiocpricci2 28.02.2012 09:58
quelle
1

Sie können versuchen, die Größe von Bildern zu reduzieren. Mein Fall hat funktioniert.

%Vor%     
sujith 25.04.2016 04:08
quelle
1

fügen Sie einfach "android: largeHeap=" true "" im Anwendungs-Tag android manifest hinzu! :)

    
matin ashtiani 03.04.2017 12:35
quelle
1

füge diese beiden Zeilen in deine Android-Manifest-Datei ein android: hardwareAccelerated="true" und android: largeHeap="true"

%Vor%

Ich hoffe, das wird dir helfen.

    
Hitesh Dhamshaniya 03.04.2017 13:15
quelle