35

Sto cercando di capire come utilizzare Loaders in Android 3.0 ma non riesco a farlo funzionare. I documenti descrivono solo utilizzando CursorLoader ma sto usando AsyncTaskLoader.Caricatori in Android Honeycomb

Dai documenti sembra che sia necessario solo implementare AsyncTaskLoader.loadInBackground() ma non viene mai chiamato dopo getLoaderManager().initLoader() e quindi creare il caricatore nel callback.

Posso vedere messaggi di debug che dicono Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}} quindi sembra che sia stato creato correttamente.

E 'possibile che attualmente i caricatori siano danneggiati nell'SDK o c'è qualche metodo che è necessario chiamare dopo aver creato il caricatore? (non l'hanno fatto nell'esempio CursorLoader).

EDIT: Sembra chiamando forceLoad() sul Loader tornato da initLoader() inizia il carico almeno, ma questo significa che non è possibile gestire le rotazioni correttamente :(

+0

Se trovi una risposta a questo per favore fammi sapere pure. Non sono stato in grado di trovare nulla. –

+2

C'è anche http://code.google.com/p/android/issues/detail?id=14944 che menziona la stessa soluzione alternativa al commento "Modifica". –

+0

Sì, questo è il mio bug report su questo :) – alexanderblom

risposta

13

Dianne Hackborn ha risposto sul bug tracker e ci ha fatto riferimento all'implementazione della libreria statica. CursorLoader sta facendo forceLoad() ed è per questo che funziona.

Vedi la mia classe in allegato per una classe che gestisce questo per voi nella maggior parte dei casi semplici al bug tracker: http://code.google.com/p/android/issues/detail?id=14944

+4

hanno davvero bisogno di documentare la CPL>. < – schwiz

+1

Questo fa davvero schifo. Quindi l'esempio mostrato qui: http://developer.android.com/reference/android/content/AsyncTaskLoader.html se si utilizza la libreria di supporto non funzionerà se non si esegue l'override di 'onStartLoading' – Blundell

+0

Quindi ora ho una mia fonte di riferimento per ASyncTaskLoader utilizzando la libreria di supporto: http://blog.blundell-apps.com/tut-asynctask-loader-using-support-library/ – Blundell

0

Alex; hai cercato di convalidare se l'onLoadInBackground()

onLoadInBackground(): chiamato su un thread di lavoro per eseguire il carico effettivo. Le implementazioni non devono fornire direttamente il risultato, ma devono restituirle da questo metodo, che alla fine finirà per chiamare deliverResult (D) su il thread dell'interfaccia utente. Se le implementazioni devono elaborare i risultati sul thread dell'interfaccia utente, possono sovrascrivere deliverRes ult (D) e farlo lì.

+1

No, non viene chiamato a meno che non si usi forceLoad(). – alexanderblom

1

È necessario eseguire l'override del metodo onStartLoading(). Guarda l'esempio su developer website.

/** 
    * Handles a request to start the Loader. 
    */ 
    @Override protected void onStartLoading() { 
     if (mApps != null) { 
      // If we currently have a result available, deliver it 
      // immediately. 
      deliverResult(mApps); 
     } 

     // Start watching for changes in the app data. 
     if (mPackageObserver == null) { 
      mPackageObserver = new PackageIntentReceiver(this); 
     } 

     // Has something interesting in the configuration changed since we 
     // last built the app list? 
     boolean configChange = mLastConfig.applyNewConfig(getContext().getResources()); 

     if (takeContentChanged() || mApps == null || configChange) { 
      // If the data has changed since the last time it was loaded 
      // or is not currently available, start a load. 
      forceLoad(); 
     } 
    }