Ich erstelle ein Spiel auf Android, und ich habe bemerkt, dass das Spiel ein Speicherleck hat. Es ist mir gelungen, das Speicherleck in eine kleinere Anwendung zu isolieren, so dass ich gut sehen und ausprobieren kann, wie ich es beheben kann.
Die Anwendung verwendet eine Oberflächenansicht für ihre Ansicht, an die ein Gewinde angehängt ist, um alle Zeichnungen auf dem Bildschirm auszuführen. Der Speicherverlust tritt auf, wenn ich eine neue Aktivität starte und die aktuell genutzte schließen. Ich kann dies sehen, wenn ich einen Speicherabzug auf meiner Testanwendung mache, da es nur eine Aktivität öffnet und schließt (Aktivität a - & gt; Aktivität b - & gt; Aktivität a). Ich habe irgendwie keine Ideen, wie ich das beheben kann, wie iv versucht, alle meine Referenzen, die ich zu der Ansicht (im Thread) erstellen, zu löschen, iv versuchte, den Rückruf von der Oberflächenansicht zu entfernen, wenn ich die Ansicht zu zerstören, und auch Innerhalb der Aktivität scheint es keinen Unterschied zu machen.
MemoryLeakActivity.java
%Vor%MemoryLeakViewThread.java
%Vor%MemoryLeak.java
%Vor%TestActivity.java
%Vor%TestViewThread.java
%Vor%Test.java
%Vor%- Bearbeiten-- Ich habe Änderungen an der View-Klasse vorgenommen, um deren SurfaceDestroyed (SurfaceHolder-Halter) so zu ändern, dass der Thread auf null gesetzt wird, wenn der Thread angehalten wird. Die Änderungen, die ich gemacht habe, sind
%Vor%Sie müssen auch die Methode SurfaceCreated (SurfaceHolder holder) in
ändern %Vor%Dann müssen wir in der Thread-Klasse folgendes ändern
%Vor%Dadurch schien es das Problem zu beheben, das einzige Problem ist jetzt, dass der Thread aufgrund der Thread-Klasse und der Thread-Gruppe im Speicher zu bleiben scheint. Aber ich denke, dies könnte auf den Debugger zurückzuführen sein.
Sie sollten keinen neuen Thread im Konstruktor erstellen, wenn Sie ihn in onSurfaceCreated erstellen. Vergleichen Sie Ihren Code mit meinem Beispiel: How kann ich das Animationsframework innerhalb der Zeichenfläche verwenden?
Wie Sie hier sehen können:
Der einfachste Weg, ein Speicherleck in Android zu starten, besteht darin, dem Konstruktor einer Ansicht die gesamte Aktivität anstelle des Anwendungskontextes zu übergeben. Haben Sie versucht, diese Zeile zu ändern:
%Vor%in diesen:
%Vor%?
Ich hoffe, es hilft.
Tags und Links memory-leaks android multithreading surfaceview