2012-05-18 8 views
5

Hier ist ein Stück vereinfachten Code:Ist dies ein Leck im Android-Kontext?

static Activity longLivedField; 

onCreate(...) {  
    longLivedField = this; // the only write to this field 
} 

Ich habe behauptet, dies als ein Zusammenhang Leck Menschen gesehen, und erstellen Sie Fixes für sie. Die typische Lösung besteht darin, das Feld an geeigneten Stellen aufzuheben. Zum Beispiel in onPause():

onPause() { 
    longLivedField = null; 
} 
+0

Sind Sie diesen Zusammenhang zu halten tun? – accordionfolder

+0

Ja. Und es gibt Vorschläge, dass wir das nicht tun sollten, sondern stattdessen getApplicationContext() verwenden. Aber ich möchte nur verstehen, warum dies ein Problem sein könnte. – dacongy

Antwort

3

Ja, es ist ein Speicherverlust, wenn Sie das Feld nicht in onPause zunichte machen(). Sie wollen fast sicher nie einen statischen Bezug zu irgendeiner Aktivität behalten. Was versuchst du zu erreichen?

Die Android-Entwickler-Website enthält eine praktische Seite beschreibt, wie Speicherlecks wie diese zu vermeiden:

Avoiding Memory Leaks

+0

Ich habe diesen Beitrag schon mehrmals gelesen. Der Unterschied besteht darin, dass das statische Feld in diesem Beispiel nur einmal geschrieben wird. Aber in diesem Fall würde das statische Feld in jedes Mal geschrieben werden, wenn ein neues Aktivitätsobjekt erzeugt wird (na ja, wenn onCreate() tatsächlich aufgerufen wird), und somit ist das alte (das, was angeblich geleakt werden soll) nein länger erreichbar vom statischen Feld. Es scheint also, dass es nur für kurze Zeit undicht sein kann, was grob gesagt zwischen onPause() und der Zuweisung in onCreate() liegt. – dacongy

+2

Das stimmt, aber das Leck tritt auf, wenn der Benutzer zu einer anderen Aktivität wechselt. Das statische Feld zeigt dann auf die letzte Instanz Ihrer Aktivität und somit auf ein Leck. –

+1

Hier ist mein Verständnis basierend auf Ihren Antworten, und korrigieren Sie mich, wenn ich falsch liege: Das Ziel ist es, Müll zu sammeln sammeln die letzte Instanz der Aktivität, wenn der Benutzer zu einer anderen Aktivität bewegt. Dies ist wichtig, da die gesamte GUI-Hierarchie einer Aktivität (ich möchte dies explizit sagen, weil Lecks in mehreren Aktivitäten oder sogar mehrere Anwendungen offensichtlich schädlich sind) eine ziemlich große Menge an Speicher verbrauchen könnte. Dies ist sinnvoll, da die Speicherbereinigung und die Objektzuordnung effizient genug sind, um die GUI-Hierarchie relativ schnell zu sammeln und zuzuordnen. – dacongy