Android - freigegebenen Speicher freigeben AnimationDrawable verwendet up

8

Ich habe ein komplexes Kampfsystem mit einer übergeordneten Aktivität und mehreren untergeordneten Klassen, die auf die statischen Variablen der BattleActivity zugreifen, indem sie Battle erweitern und den Kontext an diese Klassen weitergeben.

Das alles scheint gut zu funktionieren, aber ich habe ein Problem damit, alle meine AnimationDrawables aus dem Speicher zu veröffentlichen. Es kann insgesamt 24 DrawableAnimations geben, die während einer Schlacht verwendet werden. Dies ist im Moment zwar in Ordnung, aber jedes Mal, wenn der Benutzer ein neues Monster entdeckt, werden 4 weitere AnimationsDrawables zum Speicher hinzugefügt, was langsam dazu führt, dass meine App mit der Ausnahme "Out of Memory" abstürzt.

Deshalb muss ich wirklich einen Weg finden, um den gesamten Speicher freizugeben, den mein Kampfsystem aufnimmt, sobald ich es verlassen habe. Momentan teste ich an einem Sony Z2 und wenn der Benutzer einen Kampf beginnt, steigt der Mmeory von 91MB auf 230MB. Ich muss diese Speicherauslastung wieder auf 91 MB reduzieren, wenn der Kampf beendet ist. Ich habe ein sehr einfaches Code-Snippet hinzugefügt, um Ihnen eine Vorstellung davon zu geben, wie die App momentan fließt und was ich tun möchte, um den Speicher freizugeben.

%Vor%     
LandL Partners 19.09.2014, 16:17
quelle

2 Antworten

0

Zunächst einmal denke ich, dass Sie für AnimationDrawable kein Recycling durchführen können, wenn Sie nicht den Bereich verlassen, für den sie deklariert sind. Verteilen Sie nicht auf System.gc(); und lassen GC diese Speicher automatisch für Sie frei.

  

welche auf die statischen Variablen der BattleActivity zugreifen

das ist dein erster Fehler. Wenn Sie statische Variable verwenden, auch wenn Sie Ihre Aktivität verlassen, sind sie alle da und Sie werden auf jeden Fall OOM bekommen.

  

Daher muss ich wirklich einen Weg finden, all meinen Speicher freizugeben   Kampfsystem nimmt auf, sobald ich exitit.

Wenn Sie alle Variablen als nicht statische Variablen deklarieren, erhalten Sie OOM nicht, wenn Sie den definierten Bereich verlassen. Sie erhalten zwar OOM, wenn Sie während der laufenden Aktivität AnimationDrawable ohne Grenzen erstellen.

    
mmlooloo 08.11.2014 03:59
quelle
0

Die Verwendung von statischen Drawable (s) oder View (s) führt zu einem Speicherverlust, da die Ausdrucke statusbehaftet sind.

Sie können entweder nach anderen statischen Drawable (s) oder View (s) suchen und sie loswerden oder

anrufen %Vor%

Sie können Drawable-Objekte nicht recyceln, und es ist nicht empfehlenswert, System.gc ()

aufzurufen

Es scheint, dass Ihre App irgendwo unter einem Speicherleck leidet. Wenn Sie das oben genannte ausprobieren und der Speicher mit dieser Rate noch erweitert wird, überlegen Sie sich, ob Sie Speicheranalyse , um das Problem einzugrenzen.

    
Mostafa Gazar 13.11.2014 10:52
quelle