Tengo un par de problemas con AsyncTaskLoader, no estoy seguro de si están relacionados ya que ambos ocurren al intentar reiniciar el cargador. En mi aplicación tengo 3 instancias de un CursorAdapter personalizado, respaldado por 3 instancias de un AsyncTaskLoader personalizado administrado por 1 Singleton LoaderManager. Los problemas se relacionan con dos pares adaptador/cargador differenct, pero el código utilizado es el mismo en cada caso:Problema con las devoluciones de llamada AsyncTaskLoader personalizadas
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Problema 1: llamo restartLoader() y el LoaderManager registra una llamada a onCreateLoader, pero no uno para onLoaderReset(). El cargador llega a deliverResult(), pero onLoadFinished() nunca se llama. El cargador no tiene configurados los indicadores 'restablecer' o 'iniciado' (ver código a continuación).
Problema 2: llamo a restartLoader() y el LoaderManager registra una llamada a onLoaderReset(). El cargador llega a onReset(), pero no avanza más. El Cursor está configurado como nulo, pero no se carga ningún Cursor nuevo.
¿Alguna idea de lo que podría ser el problema? He aquí algunos de los códigos para el Administrador de Cargador y cargador:
CustomCursorLoader.java
@Override
protected void onStartLoading() {
Log.v(TAG, "Starting Loader");
if (lastCursor != null) {
deliverResult(lastCursor);
}
if (takeContentChanged() || lastCursor == null) {
forceLoad();
}
}
@Override
public void deliverResult(Cursor cursor) {
Log.v(TAG, "Delivering result");
if (isReset()) {
Log.v(TAG, "reset");
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = lastCursor;
lastCursor = cursor;
if (isStarted()) {
Log.v(TAG, "started");
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
oldCursor.close();
}
}
@Override
protected void onReset() {
Log.v(TAG, "Reset");
super.onReset();
onStopLoading();
if (lastCursor != null && !lastCursor.isClosed()) {
lastCursor.close();
}
lastCursor = null;
}
CustomCursorLoaderManager.java:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CustomCursorLoader();
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
cursorAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
cursorAdapter.changeCursor(null);
}
1. Sí, sé que el nombre no está claro, lo siento. 2. Ya no es un singleton - he estado trabajando en esa parte 3. El principal problema que tengo es que me gustaría poder usar el mismo Cursor con el mismo cargador en diferentes fragmentos vinculados a diferentes actividades – Pikaling
¿Por qué? ¿quieres compartir cursores? Probablemente no sea una buena idea: los cargadores son gestionados por actividades/fragmentos, por lo que su cargador puede cerrarse cuando finalice otra actividad. Sin embargo, puede usar el mismo Loader _class_ y hacer que se cree una instancia en diferentes actividades/fragmentos. –
Gracias por su ayuda. Revisé y volví a trabajar todo mi código, todo funcionaba ahora. A veces odio OOP ... – Pikaling