Проблемы с пользовательскими обратными вызовами AsyncTaskLoader

У меня есть пара проблем с моим 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);
}
6
задан Alex Lockwood 23 May 2012 в 04:18
поделиться