2013-04-04 21 views
5

Pracuję nad aplikacją na Androida i po raz pierwszy pracuję z obserwatorami treści. Czytałem więc wiele samouczków i otrzymałem koncepcję, dlaczego jest ona dostarczana i jak używać.Dlaczego i kiedy należy wyrejestrować obserwatorów zawartości w Androidzie?

Teraz mam czytać te wiersze na blogu, że

Nie zapomnij, aby wyrejestrować obserwatorów treści

Tak, nie jestem w stanie zrozumieć, jeśli chcę zarejestrować ContentObserver następnie co może być sytuacją, w której muszę ją wyrejestrować.

Jeśli cel obserwatorów zostanie osiągnięty, to można go wyrejestrować. Ale muszę to obserwować, dopóki użytkownik nie odinstaluje aplikacji, to dlaczego wyrejestruję obserwatora.

Oto url tego bloga

http://www.grokkingandroid.com/use-contentobserver-to-listen-to-changes/

Odpowiedz

4

Wyobraź sobie, że masz aplikację, która ma na przykład ekran listy znajomych utworzony za pomocą FriendListActivity. Teraz, aby utworzyć interfejs użytkownika dla tego działania, odczytujesz dane z DB i tworzysz swój interfejs użytkownika.

Teraz wyobraź sobie, że masz również usługę, która działa w tle i synchronizuje tę bazę danych ze zdalną bazą danych za pomocą usług internetowych.

Teraz, gdy usługa aktualizuje listę znajomych w DB, należy odpowiednio zaktualizować swój interfejs. Aby to osiągnąć, rejestrowałbyś obserwatora zawartości w swoim FriendListActivity w momencie Activity uruchomienia dla Przyjaciół URI (zakładając, że znasz pojęcie URI), tak że za każdym razem, gdy lista znajomych w bazie danych ulegnie zmianie, aktualizowałbyś listę znajomych w swoim FriendListActivity . Teraz, jeśli użytkownik przestawił się z działania lub zamknął aplikację, nie trzeba aktualizować interfejsu użytkownika (aby nie było potrzeby pobierania zdarzenia w przypadku zmian w DB), należy wyrejestrować obserwatora zawartości.

Teraz następnym razem użytkownik dojdzie do tego ekranu, byś ponownie pobrać najnowsze dane i zarejestrować się w DB do zmiany zawartości ...

Więc treść obserwator jest zwykle relacja między aktywnością i bazy danych (lub określony URI). Więc można zarejestrować go, gdy zostanie uruchomiony Activity i wyrejestrować go, gdy aktywność wychodzi z widzenia ..

Hope this helps ...

+0

Dziękuję za wspaniałe wyjaśnienie +1 dla Ciebie. –

6

proszę przeczytać link podałeś również w tym wyraźnie wspomnieć

Aby zarejestrować obserwatora w onResume() metoda cyklu i ci wyrejestruj go w metodzie onPause().

po wyrejestrowaniu jednej z tych metod nie będzie to żadna wartość i nie będzie również podawać żadnego .

@override 

    public void onDestroy() 
    { 

getContentResolver(). 
     unregisterContentObserver(yourObserver); 

    } 

lub można to zrobić również

@override 

    public void onPause() 
    { 
    getContentResolver(). 
    unregisterContentObserver(yourObserver); 

    } 
+0

to od was zależy, gdzie chcesz go wyrejestrować. – Unknown

2

W blogu, stwierdza:

Po zarejestrowaniu się treści obserwatora, to Twoim obowiązkiem jest również wyrejestrować go . W przeciwnym razie stworzysz przeciek pamięci, a Twoja aktywność nigdy nie zostanie zebrana.

Więc gdy Activity jest zamknięty należy wyrejestrować - należy to zrobić w metodzie . będzie zawsze wywoływany, gdy odejdziesz od swojego Activity.

Sprawdź cyklu dla Activities: http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

9

Wystarczy popatrzeć na activity lifecycle:

Activity lifecycle

  • Jeśli zarejestrujesz obserwatora w onCreate wyrejestrować w onDestroy
  • Jeśli zarejestruj obserwatora w onStart, którego wyrejestrujesz w onStop
  • Jeśli zarejestrujesz obserwatora w onResume wyrejestrować w

Ponieważ tylko jedna czynność może być pokazane w tym samym czasie, polecam stosując ostatnią opcję.

+0

Oto odpowiedź, której szukałem! Ładnie i zwięźle, a mimo to precyzyjnie radzisz sobie w wielu sytuacjach! – YoungCoconutCode