У меня есть пара проблем с моим AsyncTaskLoader, я не уверен, связаны ли они, поскольку они оба возникают при попытке перезапустить загрузчик. В моем приложении у меня есть 3 экземпляра настраиваемого CursorAdapter, поддерживаемого 3 экземплярами настраиваемого AsyncTaskLoader, управляемого 1 синглтон-LoaderManager. Проблемы связаны с двумя разными парами адаптер / загрузчик, но используемый код в каждом случае один и тот же:
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Проблема 1: я вызываю restartLoader (), и LoaderManager регистрирует вызов onCreateLoader, но не один - onLoaderReset (). Загрузчик получает команду deliveryResult (), но onLoadFinished () никогда не вызывается. В загрузчике не установлены флаги «сброс» или «запуск» (см. Код ниже).
Проблема 2: я вызываю restartLoader (), и LoaderManager регистрирует вызов onLoaderReset (). Загрузчик попадает в onReset (), но дальше не идет. Курсор установлен на null, но новый Курсор не загружается.
Есть идеи, в чем может быть проблема? Вот часть кода для загрузчика и диспетчера загрузчиков:
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);
}