35

Estoy tratando de averiguar cómo usar Loaders en Android 3.0, pero parece que no puede hacer que funcione. Los documentos solo describen usando CursorLoader pero estoy usando AsyncTaskLoader.Cargadores en Android Honeycomb

De los documentos parece que solo debe implementar AsyncTaskLoader.loadInBackground() pero nunca se llama después de getLoaderManager().initLoader() y luego crea el cargador en la devolución de llamada.

Veo mensajes de depuración diciendo Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}}, por lo que parece que se ha creado correctamente.

¿Es posible que los cargadores estén actualmente rotos en el SDK o hay algún método al que deba llamar después de crear el cargador? (no lo han hecho en el ejemplo CursorLoader).

EDIT: Parece que llamar forceLoad() en el cargador de regresar de initLoader() comienza la carga, al menos, pero esto significa que no puede manejar correctamente las rotaciones :(

+0

Si encuentra una respuesta a esto, por favor, hágamelo saber también. No he podido encontrar nada. –

+2

También hay http://code.google.com/p/android/issues/detail?id=14944 que menciona la misma solución que el comentario 'Editar'. –

+0

Sí, ese es mi informe de error acerca de esto :) – alexanderblom

Respuesta

13

Dianne Hackborn respondió en el rastreador de errores y nos remitió a la implementación de la biblioteca estática. CursorLoader está haciendo forceLoad() y por eso está funcionando.

Ver mi clase adjunta de la clase que se encarga de esto para usted en la mayoría de los casos simples en el seguimiento de errores: http://code.google.com/p/android/issues/detail?id=14944

+4

realmente necesitan documentar el CPL>. < – schwiz

+1

Eso realmente apesta. Entonces, el ejemplo que se muestra aquí: http://developer.android.com/reference/android/content/AsyncTaskLoader.html si utiliza la Biblioteca de soporte técnico no funcionará a menos que anule 'onStartLoading' – Blundell

+0

Así que ahora tengo mi propia fuente de referencia para ASyncTaskLoader usando la Biblioteca de soporte: http://blog.blundell-apps.com/tut-asynctask-loader-using-support-library/ – Blundell

0

Alex; ¿trató de validar si el onLoadInBackground() incluso se llama?

onLoadInBackground(): Invocado en un subproceso de trabajo para realizar la carga real. Las implementaciones no deben entregar el resultado directamente, pero deben devolverlo desde este método, que finalmente terminará llamando a deliverResult (D) en el subproceso de interfaz de usuario. Si las implementaciones necesitan procesar los resultados en el subproceso de interfaz de usuario, pueden anular entregas ult (D) y hazlo allí.

+1

No, no se llama a menos que use forceLoad(). – alexanderblom

1

Es necesario reemplazar el método onStartLoading(). Mira el ejemplo en el 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(); 
     } 
    } 
Cuestiones relacionadas