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);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie nennen einen 'LoaderManager' ist eigentlich eine Umsetzung des
LoaderManager.LoaderCallbacks<D>
- Schnittstelle. Sie möchten möglicherweise verwenden Sie einen anderen Namen, dieser ist verwirrend. Warum ist es ein singleton? Es ist in der Regel gebunden an eine Aktivität oder ein Fragment, möglicherweise nur die Aktivität/Fragment der Implementierung der Schnittstelle. Wo erstellen Sie Ihre Lader (activity/fragment)? Auch stellen Sie sicher, Sie rufenLoaderManager.initLoader()
ausonCreate()/onActivityCreated()
, da sonst der loader eventuell nicht richtig gestartet.Wenn Sie einen cursor erstellen und zeigen Sie es an eine Datenbank, Sie können nicht nur setzen Sie ihn auf null. Sie haben explizit schließen Sie den cursor, oder es wird die Datenbank sperren bis die Zeit abgelaufen ist.
Empfehle ich die Einnahme von Vorteil der Android lifecycle und Ihre vorhandenen callbacks zu implementieren, dies zu beheben.
Hoffe, das hilft!