Android Loader no activa las devoluciones de llamada en la pantalla

Estoy usando un AsyncTaskLoader . Tengo una actividad que ha implementado LoaderCallbacks (biblioteca de soporte).

Tengo punto de ruptura depurado y puesto en registros, el cargador entrega el resultado, sin embargo la segunda vez que la devolución de llamada onLoadFinished no se activa. Lo raro – cuando vuelvo a girar de nuevo funciona, que nunca la orientación que empiezo a obtiene callbacks cuando vuelva a ella.

En mi actividad onResume :

 LoaderManager lm = getSupportLoaderManager(); Loader loader = lm.initLoader(0, null, new LoaderManager.LoaderCallbacks<String>() { @Override public Loader<String> onCreateLoader(int i, Bundle bundle) { Loader<String> loader = new TestLoader(MainActivity.this); return loader; } @Override public void onLoadFinished(Loader<String> stringLoader, String s) { Log.d(Application.TAG, "OnLoadFinished " + s); doStuff(s); } @Override public void onLoaderReset(Loader<String> stringLoader) { // NOP } }); 

En mi cargador:

 public class TestLoader extends AsyncTaskLoader<String> { private String mData; public TestLoader(Context context) { super(context); } // This get's called after a loader is initialized or a loader // that is alive still is reset @Override public void onStartLoading() { if (mData != null) { // Have our data loaded, just deliver it! deliverResult(mData); } if (takeContentChanged() || mData == null) { forceLoad(); } } // This is called when an Activity or Fragment requests a loader // to be reset because they want new data @Override public void onReset() { mData = null; // Ensure that the old task is cancelled if it was running // We do NOT have to call forceLoad here because onStartLoading // will get called after this cancelLoad(); } // Here we just want to store our own data we got and reset our boolean @Override public void deliverResult(String data) { Log.d(Application.TAG, "deliverResult " + data); mData = data; super.deliverResult(mData); } @Override public String loadInBackground() { // returns content from a content provider ... } } 

Realmente desconcertado por este, soy nuevo en Android, así que tal vez esto es obvio para alguien más 🙂

Debe llamar simplemente getSupportLoaderManager() / getLoaderManager() en onCreate() si es una Activity o onActivityCreated() si es un Fragment . El initLoader() real initLoader() puede estar en otro lugar. De lo contrario el cargador estará en un estado detenido y no entregará los resultados a pesar de que completa la carga. Sospecho que es porque el encargado del cargador no vuelve a conectar los cargadores viejos a la nueva Activity menos que la llamada anterior se haga en onCreate() la nueva Activity onCreate() .

Tienes

 Loader loader = lm.initLoader(...) 

Deberías

 Loader loader = new LoaderManager.LoaderCallbacks(...) {...} 

Y en su onResume()

 this.getLoaderManager().restartLoader(0, null, this.loader); 

Consulte la documentación del cargador .

  • AsyncTaskLoader onLoadFinished con un cambio de tarea y configuración pendiente
  • SherlockFragmentActivity con múltiples ListFragments y batallas con cursor SQLite
  • Explique AsyncTaskLoader
  • LoaderManager con múltiples cargadores: cómo obtener el cursor correcto
  • Cuando una actividad se destruye debido a un cambio de configuración, ¿también se destruyen sus cargadores?
  • Android - CursorLoader y SQLite sin proveedor de contenido
  • Múltiples cargadores con LoaderManager, no consiguiendo derecho Cargador
  • ¿Por qué nunca se llama a mi OnLocationChanged ()?
  • Manejar excepciones de CursorLoader
  • Error en LoaderManager al utilizar la biblioteca de soporte
  • ¿Modelo para cargadores múltiples con LoaderManager?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.