Android – onLoadFinished no se llama

Estoy enfrentando un problema con Loader.

Tengo una actividad, que exhibe la lista de expedientes recuperados de DB local. Cuando se inicia la actividad, los registros se cargan automáticamente a través del método LoaderManager.initLoader ().

También existe la posibilidad de actualizar manualmente la lista mediante el botón de actualización en ActionBarSherlock. Sin embargo, después de terminar otra actividad que añade un registro a DB, onLoadFinished no se llama.

Estoy usando SimpleCursorLoader y aquí hay un fragmento de código de la actividad:

@Override public void onStart() { ... getSupportLoaderManager().initLoader(0, null, this); } @Override public void onPause() { ... getSupportLoaderManager().destroyLoader(0); } public void refreshRecords() { getSupportLoaderManager().restartLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, final Bundle args) { Loader<Cursor> l = new SimpleCursorLoader(this) { @Override public Cursor loadInBackground() { return recordDAO.getCursor(); } }; l.forceLoad(); return l; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { // updateUI } @Override public void onLoaderReset(Loader<Cursor> loader) { } 

El problema es que después de terminar la otra actividad, onLoaderCreate se llama, pero onLoaderFinished no se llama.

Después de un poco de depuración, he encontrado que SimpleCursorAdapter.deliverResults() también se llama, el brote termina en .. if (isReset()) { ..

¿Me estoy perdiendo de algo? ¿Cómo forzar la recarga de datos?

Gracias de antemano

Finalmente he encontrado la solución a este problema gracias a la discusión sobre

https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI

 public static <T> void initLoader(final int loaderId, final Bundle args, final LoaderCallbacks<T> callbacks, final LoaderManager loaderManager) { final Loader<T> loader = loaderManager.getLoader(loaderId); if (loader != null && loader.isReset()) { loaderManager.restartLoader(loaderId, args, callbacks); } else { loaderManager.initLoader(loaderId, args, callbacks); } } 

La solución RaB no funciona para mí

Mi solución trabajada , siempre destruía Loader antes de reiniciar

 Loader<Cursor> loader = mLoaderManager.getLoader(mKeyLoader); if (loader != null) { mLoaderManager.destroyLoader(mKeyLoader); } mLoaderManager.restartLoader(mKeyLoader, args, this); 

Fwiw, tuve un problema similar al intentar reiniciar inmediatamente el cargador una segunda vez, antes de que se llamara el primer onLoadFinished, resultando en que no se llamara.

Esto funcionó para mí:

 if( loader == null ) loader = loaderMngr.initLoader( 0, null, myLoaderCallbacks ); else if( loader.isAbandoned() ) return; else loaderMngr.restartLoader( 0, null, myLoaderCallbacks ); 

Además de la respuesta de RaB, si está utilizando un Loader personalizado, asegúrese de que si llama super si sobrescribe deliverResult() :

 @Override public void deliverResult(D data) { super.deliverResult(data); // <--onLoadFinished() will not be called if you don't call this ... } 
  • ¿Cómo CursorLoader actualiza automáticamente la vista incluso si la aplicación está inactiva?
  • ¿Cómo insertar correctamente valores en la base de datos SQLite utilizando el método insert () de ContentProvider mediante un CursorLoader?
  • Diferencia entre `initLoader` y` restartLoader` en `LoaderManager`
  • Android - CursorLoader y SQLite sin proveedor de contenido
  • Actualización asíncrona de vista fragmentada: ImageView no se actualiza, pero otros niños se actualizan en la vista
  • IllegalStateException "intenta volver a abrir un objeto ya cerrado" en SimpleCursorAdapter de ContentProvider
  • AsyncTaskLoader no llama a onLoadFinished a menos que devuelva un nuevo objeto en loadInBackground
  • ¿Modelo para cargadores múltiples con LoaderManager?
  • Loader no se inicia después de llamar a initLoader ()?
  • AsyncTaskLoader onLoadFinished con un cambio de tarea y configuración pendiente
  • Utilizar un Cursor devuelto desde un LoaderManager en un AsyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.