2013-03-24 14 views
5

Pytanie projektowe w zasadzie - czy ma być , czy należy go wprowadzić w innej klasie - na przykład w wewnętrznej klasie? Czy jest jakiś powód, dla którego jeden wolałby ten niż inne podejście?Android: Gdzie powinien być zdefiniowany/zarejestrowany OnSharedPreferenceChangeListener?

Gdzie należy zarejestrować słuchacza? Mam na myśli the docs i zdrowy rozsądek nakazują zarejestrować/wyrejestrować odpowiednio onResume/onPause, ale widząc azillionregistrations w onCreate Po prostu zastanawiam się, czy czegoś brakuje.

Nie jestem też całkiem pewien, czy brak wyrejestrowania (a więc, na przykład wyrejestrowanie, nie może zostać wywołane jako onStop, nie gwarantuje się, że zostanie wywołany) musiałby prowadzić do wycieku. Więc jeśli mam na przykład

class MyPref extends PreferenceActivity implements 
      OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 
    // init sharedPreferences 
    onStart(){ 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 
    // no unregistration 
} 

Czy ten wyciek instancję MyPref raz wrócę do jednego z moich innych zajęć?

Na koniec - czy te same kwestie miałyby zastosowanie do OnPreferenceChangeListener?

Edycja: wracając do tego, nie widzę sposobu, aby wyrejestrować OnPreferenceChangeListener - czy jestem ślepy?

Odpowiedz

1

Nie sądzę, że istnieją ważne powody, by faworyzować określoną lokalizację dla słuchacza, poza osobistymi preferencjami. Posiadanie Activity zaimplementować ją lub używając wewnętrznej klasy - anonimowej lub nie - jest w porządku.

Jedyna rzecz, jeśli nie używasz istniejącego obiektu takiego jak twój Activity jako słuchacza, będziesz musiał zachować odniesienie do obiektu słuchacza. Jak na this answer otrzyma śmieci zebrane (a więc nie będzie niczego słuchać), jeśli tego nie zrobisz.


Po wbiły źródła nieco, wydaje SharedPreferencesImpl używa WeakHashMap zawierać zarejestrowanych słuchaczy (source, linie 72-73, 186-196), co oznacza, że ​​w przypadku braku wyrejestrować nie będzie spowodować nieszczelność.

Tak jak mówisz, dokumenty zalecają używanie onResume()/onPause(); to prawdopodobnie nie ma nic wspólnego z przeciekami, ale zamiast tego zapobiegać niepotrzebnemu przetwarzaniu aplikacji w tle - więc warto je śledzić!

0

Rejestracja i wyrejestrowanie w /onResume to dodatkowa praca za darmo.

Można zrobić anonimową realizację swojego słuchacza jako część swojej klasie tak:

[class level] 
... 
OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { 
    onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // your code here 
    } 
}; 
... 
[class level] 

Następnie należy ustawić go w stosownych przypadkach. Jeśli to zrobisz, Twój detektor nie zostanie ponownie utworzony jako inny obiekt między /onResume (chyba że twoja aplikacja zostanie zabita i twoja podklasa Activity musi być załadowana ponownie), więc przypisanie jej wtedy jest bezcelowe, ponieważ będziesz zawsze odwołuj się do tego samego obiektu. Z drugiej strony, jeśli twoja aplikacja zostanie zabita, ponownie zostanie wywołana onCreate.

Jeśli chodzi o implementację klasy wewnętrznej, czy nie, preferuję anonimową implementację (jak pokazano powyżej) ze względu na zwiększoną czystość kodu - nie muszę zawracać sobie głowy nazwami klas i muszę wpisz mniej nawiasów. Jednak jest to naprawdę rzeczą preferowaną, więc rób to, co uważasz za lepsze.

+1

_ Rejestracja rejestracji i de-registration_ - dlaczego? czy nie trzeba wyrejestrowywać słuchacza? a co z nieszczelnością, o którą pytałem? –

+0

Nie musisz go wyrejestrowywać. System po prostu go zabije, jeśli zdecyduje się zabić aplikację. Poza tym każda aplikacja działa w swojej własnej instancji maszyny wirtualnej, która również zostaje zabita, więc nie musisz niczego wyrejestrowywać i nie dojdzie do wycieku - cała pamięć zostanie zwolniona po zakończeniu procesu (jądro się tym zajmie) . Dlatego zaleca się zapisywanie danych w trwałym miejscu w 'onPause' lub' onStop'. Jednak nie dzieje się to pomiędzy 'onPause' i' onResume'. – Shade

+0

@Mr_and_Mrs_D, czy znalazłeś lepszą odpowiedź na to pytanie? Jeśli tak, dlaczego nie odpowiesz na to z korzyścią dla wszystkich? – Shade

Powiązane problemy