2012-05-18 13 views
5

Oto fragment z uproszczonego kodu:Czy jest to wyciek kontekstu systemu Android?

static Activity longLivedField; 

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

Widziałem ludzi, twierdząc, to jako przeciek kontekstowego, a także tworzyć poprawki do niego. Typową poprawką jest unieważnienie pola w odpowiednich miejscach. Na przykład, w onPause():

onPause() { 
    longLivedField = null; 
} 
+0

to robisz, aby utrzymać kontekst? – accordionfolder

+0

Tak. Są też sugestie, że nie powinniśmy tego robić, ale zamiast tego używamy metody getApplicationContext(). Ale chcę tylko zrozumieć, dlaczego to może być problem. – dacongy

Odpowiedz

3

Tak, to jest przeciek pamięci, jeśli nie zniweczyć boiska w OnPause(). Niemal na pewno nie chcesz zachować statycznego odniesienia do jakiegokolwiek działania. Co chcesz osiągnąć?

Android site web developer zawiera poręczny stronę opisującą jak uniknąć przecieków pamięci jak ten:

Avoiding Memory Leaks

+0

Przeczytałam ten wpis wcześniej, kilka razy. Różnica polega jednak na tym, że pole statyczne jest zapisywane tylko raz w tym przykładzie. Ale w tym przypadku, statyczne pole będzie zapisywane za każdym razem, gdy tworzony jest nowy obiekt aktywności (no cóż, gdy onCreate() jest nazywany faktycznie), a tym samym stary (ten, który powinien być * przeciekał) nie jest dłużej osiągalny z pola statycznego. Wydaje się więc, że może on być przeciekający tylko przez krótki okres czasu, który, w przybliżeniu, jest pomiędzy onPause() i przypisaniem w onCreate(). – dacongy

+2

To prawda, ale przeciek wystąpi, gdy użytkownik przejdzie do innej czynności. Pole statyczne wskaże następnie ostatnią instancję twojej aktywności, a tym samym wyciek. –

+1

Oto moje zrozumienie oparte na twoich odpowiedziach, i popraw mnie, jeśli się mylę: celem jest umożliwienie marnowania czasu na zbieranie ostatniego wystąpienia aktywności, gdy użytkownik przechodzi do innej czynności. Ważne jest, aby to zrobić, ponieważ cała hierarchia GUI jednego działania (chcę to wyraźnie powiedzieć, ponieważ przecieki w wielu działaniach lub nawet wiele aplikacji są oczywiście szkodliwe) może pochłonąć dość znaczną ilość pamięci. Jest to uzasadnione, ponieważ zbieranie śmieci i przydzielanie obiektów są wystarczająco wydajne, aby dość szybko zebrać i przydzielić hierarchię GUI. – dacongy

Powiązane problemy