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% 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.
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 ()
aufzurufenEs 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.
Tags und Links java memory-leaks android memory-management animationdrawable