2012-10-17 15 views
10

Zaimplementowałem program ładujący w mojej aplikacji do wysyłania zapytań o dane z bazy danych. Słucham zmian, które nastąpiły "poprzez implementację detektora LoaderCallbacks<Cursor>. Problemem, który mam, jest użycie metody onLoaderReset(Loader<Cursor> loader), gdy moje dane ulegają zmianie i chcę unieważnić i zwolnić wszelkie dane powiązane z modułem ładującym. We wszystkich przykładach, w tej metodzie jest następujące wezwanie:Ładowarki i onLoaderReset Android

mAdapter.swapCursor(null);

Ale chodzi o to, że nie należy używać danych z kursorem w adapterze, używam go w jakiś inny sposób, w mojej aplikacji .

(bezpośrednio od zwracanej kursora w onLoadFinished(Loader<Cursor> loader, Cursor data), na przykład)

 @Override 
     public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

      if (data.moveToFirst()) { 
       TOTAL_CARDS = data.getCount(); 
       mView.createCards(TOTAL_CARDS); 
      } else { 
       TOTAL_CARDS = 0; 
       mView.createCards(TOTAL_CARDS); 
      } 


     } 

Jaki byłby odpowiedni rzeczą do zrobienia tutaj, że jest podobna mAdapter.swapCursor. Nie mam dużego doświadczenia z ładowarkami, w rzeczywistości właśnie zacząłem z nimi pracować, więc jeśli ktoś ma na to rozwiązanie, byłbym wdzięczny. Dzięki!

EDIT: Na razie jestem przechodzącej null ładowacza i działa tak:

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
     loader = null; 
} 

}; 

Ale czy jest to właściwe rozwiązanie?

Odpowiedz

24

Doing

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    loader = null; 
} 

jest tak samo dobra jak nic nie robi. W twoim przykładowym kodzie, jesteś jedynie nulling lokalnej lokacji odwołań do jej argumentu. Jednak odniesienie to będzie zawsze usuwane po zwróceniu wywołania metody. (Być może chcesz przeczytać Is Java "pass-by-reference" or "pass-by-value"? do dalszej dyskusji na ten temat.)

Sposób onLoaderReset(Loader) jest wywoływana gdy zwrotna Twojego ładującego (zwykle Activity lub Fragment instancja) jest proszony, aby zwolnić wszystkie odniesienia do Cursor która zyskała wcześniej przez onLoadFinished(Loader, Cursor). Zasadniczo ta metoda prosi o wyczyszczenie, ponieważ Loader wkrótce zamknie dostarczoną wcześniej wersję Cursor. Po zamknięciu kursora nie będzie można już pobierać danych za jego pomocą. Jeśli kursor byłby nadal w użyciu (zwykle przez CursorAdapter, jak wspomniano) po jego zamknięciu, spowodowałoby to zgłoszenie wyjątku.

Podobnie, ma domyślną umowę z zapytaniem, że po zwróceniu metody każdy wcześniej podany Cursor obiekt nie może dłużej być w użyciu. Zamiast tego należy zastąpić te odniesienia nowym kursorem, który jest podawany jako argument metody. W przeciwieństwie do tego, onLoaderReset(Loader) prosi o wypełnienie tej samej umowy, ale bez dostarczenia zamiennika, tj. Należy usunąć wszystkie odniesienia do poprzednio pobranego Cursor.

W tym przykładzie użytkownik nie pozwala, aby numer Cursor wymykał się zakresowi metody, ale zamiast tego od razu odczytuje dane. W związku z tym nie ma potrzeby usuwania żadnych odwołań do obiektu Cursor, które zostały dostarczone za pośrednictwem onLoadFinished(Loader, Cursor), ponieważ nie istnieją żadne. Pusta implementacja onLoaderReset(Loader) w celu spełnienia umowy z interfejsem będzie więc wykonywać to zadanie za Ciebie.

+0

Dziękuję za odpowiedź i wyjaśnienie. Tylko szybkie pytanie.Gdybym miał odwołanie do kursora w funkcji onLoadFinished (którego użyłbym poza zasięgiem metody), powinienem zamknąć go w onLoaderReset, prawda? – Sandra

+0

Właściwie nie. Program ładujący zamknie dla ciebie referencję 'Cursor'. To jest główny powód, dla którego powinieneś opublikować referencje. Najprawdopodobniej nie będziesz w stanie użyć starego kursora po powrocie metod 'onLoadFinished (Loader, Cursor)'/'onLoaderReset (Loader)'. –

+4

Więc jaki jest dobry przypadek użycia implementacji metodyLoaderReset()? –