2013-05-24 11 views
6

Attualmente, ho un caricatoreDifferenza tra restartLoader e onContentChanged

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

A volte, ho bisogno di chiedere il caricatore per ricaricare di nuovo, a causa di cambiamenti di contenuto. Lo farò.

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

Tuttavia, vorrei passare alcune informazioni fascio supplementare al onCreateLoader callback quando il contenuto cambia. Mi rendo conto che usando onContentChanged, non c'è modo di farlo.

L'unico modo per capire è

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

mi chiedevo, c'è qualche differenze principali nel Loader comportamento, di utilizzare restartLoader anziché onContentChanged, oltre alla capacità di passare in bundle?

risposta

4

Credo, la differenza principale è che il metodo restartLoader distrugge la vecchia loader che ha lo stesso ID e inizia uno nuovo mentre il metodo onContentChanged sia costringe il caricatore per caricare (forceLoad) o semplicemente imposta un flag che indica la il contenuto è cambiato mentre il caricatore è stato fermato. Nel secondo caso il "proprietario" del caricatore rimane responsabile del suo (ri) caricamento dopo che il contenuto è cambiato. Presumo che ciò avvenga automaticamente dal loaderManager come nel caso restartLoader.

Se si decide di utilizzare il metodo restartLoader, è necessario tenere presente la distruzione del vecchio caricatore e le possibili implicazioni per l'applicazione, ad esempio re-inizializzazioni lente e così via.

Potete dare un'occhiata alla documentazione metodi per maggiori informazioni - restartLoader e onContentChanged

Si noti inoltre che il vecchio caricatore è distrutta quando quello nuovo termina il suo lavoro

0

chiamata restartLoader ogni volta che si vuoi nuovi dati o vuoi cambiare i tuoi argomenti per il cursore.

Se si utilizza initLoader di caricare i dati

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

Ogni chiamata a initLoader tornerà lo stesso cursore onLoadFinished. Il metodo onCreateLoader verrà chiamato solo alla prima chiamata a initLoader. Quindi non è possibile modificare la query. Ottieni lo stesso cursore con gli stessi dati nel metodo 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. 
} 

Quindi, per ottenere nuovi dati del cursore per onLoadFinished uso restartLoader e si può passare nelle informazioni fascio, se vuoi. Sotto sto passando null perché c'è una variabile globale disponibile.

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

Il loaderManager sarà quindi chiamare il 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; 
} 

Note: Non è necessario chiamare initLoader è possibile chiamare restartLoader ogni volta che è a meno che non si vuole veramente gli stessi dati che è stato restituito dalla query precedente. Non è necessario chiamare lo onContentChanged() e nello docs si dice che lo Loader.ForceLoadContentObserver sia fatto per te.