2012-10-17 20 views
10

Ho implementato un programma di caricamento nella mia applicazione per interrogare i dati dal database. Ascolto i cambiamenti che accadono 'implementando il listener LoaderCallbacks<Cursor>. Il problema che ho è quando si utilizza il metodo onLoaderReset(Loader<Cursor> loader) quando i miei dati cambiano e voglio invalidare e liberare tutti i dati associati al caricatore. In tutti gli esempi, in questo metodo v'è la seguente chiamata:Caricatori e onLoaderReset Android

mAdapter.swapCursor(null);

Ma la cosa è io non uso i dati dal cursore adattatore, lo uso in qualche altro modo nella mia applicazione .

(direttamente dal cursore restituito in onLoadFinished(Loader<Cursor> loader, Cursor data), per esempio)

 @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); 
      } 


     } 

Quale sarebbe la cosa corrispondente per fare qui, che è simile con mAdapter.swapCursor. Non ho molta esperienza con i caricatori, infatti ho appena iniziato a lavorare con loro, quindi se qualcuno ha una soluzione a questo, lo apprezzerei. Grazie!

EDIT: Per ora, sto passando null per il caricatore e funziona, in questo modo:

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

}; 

Ma è questa la soluzione giusta?

risposta

24

Facendo

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

è altrettanto buono come non fare nulla. Nel tuo codice di esempio, sei semplicemente annullando il riferimento locale del metodo al suo argomento. Tuttavia, questo riferimento verrà sempre rimosso dopo il ritorno della chiamata al metodo. (Si potrebbe desiderare di leggere Is Java "pass-by-reference" or "pass-by-value"? per una ulteriore discussione del tema.)

Il metodo onLoaderReset(Loader) viene chiamato quando richiamata del loader (di solito un esempio Activity o Fragment) viene chiesto di rilasciare tutti i riferimenti al Cursor che ha guadagnato via onLoadFinished(Loader, Cursor) prima. Fondamentalmente questo metodo ti chiede di ripulire poiché lo Loader chiuderà presto lo Cursor che ti è stato fornito in precedenza. Dopo che il cursore è stato chiuso, non sarà più possibile recuperare i dati da esso. Se il cursore dovesse comunque essere ancora in uso (in genere da un CursorAdapter come hai menzionato) dopo che è stato chiuso, ciò causerebbe il lancio di un'eccezione.

Analogamente, onLoadFinished(Loader, Cursor) ha un contratto implicito che richiede che dopo che il metodo restituisce qualsiasi oggetto precedentemente fornito, gli oggetti Cursor non devono essere più in uso. Invece, devi sostituire questi riferimenti con il nuovo cursore che viene fornito come argomento del metodo. Al contrario, onLoaderReset(Loader) ti chiede di soddisfare lo stesso contratto, ma senza fornire una sostituzione, cioè dovresti rimuovere tutti i riferimenti a uno Cursor precedentemente recuperato.

Nel tuo esempio, non lasciare che il tuo Cursor esca dall'ambito del metodo ma invece stai leggendo i dati subito. Pertanto, non è necessario rimuovere alcun riferimento a un oggetto Cursor fornito tramite onLoadFinished(Loader, Cursor) poiché non ce ne sono. Un'implementazione vuota di onLoaderReset(Loader) per soddisfare il contratto di interfaccia farà quindi il lavoro per voi.

+0

Grazie per la risposta e la spiegazione. Solo una domanda veloce però.Se avessi un riferimento a un cursore in onLoadFinished (che userei al di fuori dell'ambito del metodo), dovrei chiuderlo in onLoaderReset, giusto? – Sandra

+0

In realtà, no. Il loader chiuderà il riferimento "Cursore" per te. Questo è il motivo principale per cui dovresti rilasciare i riferimenti. Molto probabilmente non sarà possibile utilizzare il vecchio cursore dopo il ritorno dei metodi 'onLoadFinished (Loader, Cursor)'/'onLoaderReset (Loader)'. –

+4

Quindi, che cosa è un buon caso d'uso per implementare il metodo onLoaderReset()? –

Problemi correlati