2013-05-24 9 views
6

Obecnie mam ładowarkęRóżnica między restartLoader i onContentChanged

@Override 
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) { 
    return new HomeMenuRowInfosLoader(this.getSherlockActivity()); 
} 

Czasami muszę zapytać ładowarka ponownie przeładować, z powodu zmian treści. Zrobię to.

this.getLoaderManager().getLoader(0).onContentChanged(); 

Jednak chciałbym przekazać kilka dodatkowych informacji wiązki do onCreateLoader zwrotnego, gdy zmienia się zawartość. Zdaję sobie sprawę, używając onContentChanged, nie ma sposobu, aby to zrobić.

Jedyny sposób mogę dowiedzieć się

this.getLoaderManager().restartLoader(0, bundle, this); 

Zastanawiałem się, czy są jakieś istotne różnice w Loader zachowań, z użyciem restartLoader zamiast onContentChanged, oprócz zdolności do podejmowania w pakiecie?

Odpowiedz

4

myślę, główną różnicą jest to, że metoda restartLoader niszczy starą ładowarkę, która ma ten sam identyfikator i rozpoczyna nowe, natomiast metody onContentChanged albo zmusza ładowarka do ładowania (forceLoad) lub po prostu ustawia flagę, która wskazuje zawartość zmieniła się, gdy program ładujący został zatrzymany. W drugim przypadku "właściciel" programu ładującego pozostaje odpowiedzialny za jego (ponowne) ładowanie po zmianie treści. Zakładam, że dzieje się to automatycznie przez loaderManager, tak jak w przypadku restartLoader.

Jeśli zdecydujesz się na użycie metody restartLoader, powinieneś pamiętać o zniszczeniu starego programu ładującego i możliwych implikacjach dla Twojej aplikacji, takich jak powolne ponowna inicjalizacja i tak dalej.

Można przyjrzeć się dokumentacji metod, aby uzyskać więcej informacji - restartLoader i onContentChanged

Należy również pamiętać, że stara ładowarka jest zniszczona gdy nowy jeden kończy swoją pracę

0

połączenia restartLoader Za każdym razem kiedy chcesz mieć nowe dane lub chcesz zmienić argumenty dla kursora.

Jeśli używasz initLoader załadować dane

lm = fragment.getLoaderManager(); 
lm.initLoader(LOADER_ID_LIST, null, this); 

Każde wywołanie initLoader zwróci ten sam kursor onLoadFinished. Metoda onCreateLoader zostanie wywołana tylko w pierwszym wywołaniu funkcji initLoader. Dlatego nie można zmienić zapytania. Otrzymasz te same kursor same dane do metody onLoadFinished.

@Override 
public void onLoadFinished(
     android.support.v4.content.Loader<Cursor> loader, Cursor cursor) { 
    switch (loader.getId()) { 
    case LOADER_ID_LIST: 
     // The asynchronous load is complete and the data 
     // load a list of 
     populateFromCursor(cursor); 
     break; 
    case LOADER_ID_ENTRY: 
     populateFromCursor(cursor); 
     break; 
    } 
    // The listview now displays the queried data. 
} 

Tak, aby uzyskać nowe dane kursora onLoadFinished użytku restartLoader i można przejść w wiązki informacji, jeśli chcesz. Poniżej podajemy wartość null, ponieważ dostępna jest zmienna globalna.

lm = fragment.getLoaderManager(); 
lm.restartLoader(LOADER_ID_LIST, null, this); 

Menedżer ładujący następnie wywoła onCreateLoaderMethod.

@Override 
public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, 
     Bundle args) { 

    android.support.v4.content.Loader<Cursor> ret = null; 

    // Create a new CursorLoader with the following query parameters. 
    switch (id) { 

    // load the entire list 
    case LOADER_ID_LIST: 
     String sortOrder = null; 
     switch (mSortOrder) { 
     case 0: 
      sortOrder = RidesDatabaseHandler.KEY_DATE_UPDATE + " desc"; 
      break; 
     case 1: 
      sortOrder = RidesDatabaseHandler.KEY_ID + " desc"; 
      break; 
     case 2: 
      sortOrder = RidesDatabaseHandler.KEY_NAME; 
     } 
     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, null, null, sortOrder); 

     // load a single item 
    case LOADER_ID_ENTRY: 
     sortOrder = null; 
     String where = RidesDatabaseHandler.KEY_ID + "=?"; 

     String[] whereArgs = new String[] { Integer.toString(lastshownitem) }; 

     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, where, whereArgs, null); 
    } 
    return ret; 
} 

Uwagi: Nie trzeba zadzwonić initLoader można nazwać restartLoader za każdym razem to chyba naprawdę chcesz te same dane, który został zwrócony z poprzedniego zapytania. Nie musisz dzwonić pod numer onContentChanged(), a w docs oznacza to, że Loader.ForceLoadContentObserver jest zrobione za Ciebie.