Moja aktywność próbuje utworzyć AlertDialog, który wymaga kontekstu jako parametru. Działa to zgodnie z oczekiwaniami, jeśli użyję:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Jestem jednak ostrożny w używaniu „tego” jako kontekstu ze względu na możliwość wycieków pamięci, gdy Aktywność zostanie zniszczona i odtworzona nawet podczas czegoś prostego, takiego jak obracanie ekranu. Z pokrewnego postu na blogu programisty Androida :
Istnieją dwa proste sposoby uniknięcia wycieków pamięci kontekstowej. Najbardziej oczywistym z nich jest unikanie ucieczki z kontekstu poza własnym zasięgiem. Powyższy przykład pokazuje przypadek odniesienia statycznego, ale klasy wewnętrzne i ich ukryte odniesienie do klasy zewnętrznej mogą być równie niebezpieczne. Drugim rozwiązaniem jest użycie kontekstu aplikacji. Ten kontekst będzie istniał tak długo, jak długo aplikacja będzie żyła i nie będzie zależeć od cyklu życia działań. Jeśli planujesz zachować obiekty o długiej żywotności, które potrzebują kontekstu, zapamiętaj obiekt aplikacji. Możesz go łatwo uzyskać, wywołując Context.getApplicationContext () lub Activity.getApplication ().
Ale dla AlertDialog()
żadnego z nich getApplicationContext()
lub getApplication()
jest akceptowalny jako kontekst, ponieważ rzuca wyjątek:
„Nie można dodać okna - token null nie jest przeznaczony dla aplikacji”
według referencji: 1 , 2 , 3 itd.
Czy to naprawdę powinno być uważane za „błąd”, skoro oficjalnie zaleca się stosowanie, Activity.getApplication()
a mimo to nie działa tak, jak w reklamie?
Jim