Probleme mit Custom AsyncTaskLoader Rückrufe

Ich habe ein paar Probleme mit meinem AsyncTaskLoader, nicht sicher, ob Sie verwandt, als Sie beide zufällig beim Versuch, starten Sie den Loader. In meiner Anwendung habe ich 3 Instanzen einer benutzerdefinierten CursorAdapter, unterstützt durch 3 Instanzen einer benutzerdefinierten AsyncTaskLoader verwaltet von 1 singleton LoaderManager. Die Probleme beziehen sich auf zwei verschiedenen Adapter/Lader Paaren, aber der code ist der gleiche in jedem Fall:

getLoaderManager().restartLoader(loaderId, bundle, loaderManager);

Problem 1: ich nenne restartLoader() und die LoaderManager Registern einen Aufruf onCreateLoader, aber nicht onLoaderReset(). Der Loader bekommt deliverResult(), aber onLoadFinished() wird nie aufgerufen. Der Loader hat weder der 'reset' oder 'gestartet', flags gesetzt (siehe code unten).

Problem 2: ich nenne restartLoader() und die LoaderManager Registern einen Aufruf onLoaderReset(). Der Loader bekommt onReset(), aber nicht mehr weiter komme. Der Cursor wird auf null gesetzt, aber keine neuen Cursor ist geladen.

Irgendwelche Ideen was das problem sein könnte? Hier noch der code für den Loader und Loader Manager:

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);
}
InformationsquelleAutor Pikaling | 2011-08-22
Schreibe einen Kommentar