2010-04-20 9 views
5

Mam statyczną klasę Preferencje, która ma pewne preferencje aplikacji i takie tam. Czy można przechowywać tam odwołanie do ApplicationContext? Potrzebuję tego odniesienia, aby uzyskać folder pamięci podręcznej i podobne rzeczy w klasach, które nie dziedziczą działania.Android - przechowywanie odwołań do ApplicationContext

Odpowiedz

6

Masz prawo korzystać z ApplicationContext tam, ponieważ jeśli nie it can cause significant memory leaks.

Jednak problem polega na tym, że zmienna static może nie zachować swojej wartości. Ze względu na sposób, w jaki Android obsługuje aplikacje, możliwe jest, że twoja aplikacja może zostać zabita, a następnie zrestartowana - zwykle z powodu przełączenia użytkownika na inne aplikacje - w taki sposób, że zmienna static stanie się pusta, a Twój kod, który ją ustawi, wygra. t być uruchomione. Have a look at this question for a more detailed answer.

Możliwe, że uda się obejść ten problem, ale przetestowanie wszystkich możliwości, które mogą spowodować, że zmienna zakończy się, będzie czasochłonne i podatne na błędy. Tak więc w moich klasach preferencji statycznych wprowadziłem jedną z metod, które wymagają użycia argumentu jako Context. Na przykład:

static int getSomeIntegerPreference(Context context) { 
    return PreferenceManager.getDefaultSharedPreferences(context).getInt(PREFERENCE_SOME_INTEGER, 0); 
} 

Jest brzydki, ale działa.

+0

Ustawiłem moje Preferences.applicationContext na getApplicationContent() przy pierwszym uruchomieniu działania. Więc myślę, że powinno tam być, chyba że aplikacja umiera (VM umiera, proces zostaje zabity, itd.). A jeśli umrze, przy następnym uruchomieniu ponownie zainicjuje Preferences.applicationContext, więc myślę, że powinno działać poprawnie. Potrzebuję czegoś takiego, ponieważ potrzebuję dostępu do kontekstu w niektórych klasach, które nie widzą getApplicationContext(). Na przykład moja kategoria musi pobrać ikony dla każdej kategorii, więc ustawiam ścieżkę ikony na tę. filepath = Preferences.applicationContext.getCacheDir(). ToString – nixa

+1

Będziesz musiał zainicjować 'Preferences.applicationContext' w * every * Activity, która używa twojej klasy' Preferences'. Twój proces może zostać zabity podczas wykonywania innej czynności niż pierwsza aktywność, a Android może zwrócić użytkownika do tego punktu w aplikacji, pomijając pierwszą czynność. –

Powiązane problemy