我的 AsyncTaskLoader 有几个问题,不确定它们是否相关,因为它们都在尝试重新启动 Loader 时发生。在我的应用程序中,我有 3 个自定义 CursorAdapter 实例,由 3 个由 1 个单例 LoaderManager 管理的自定义 AsyncTaskLoader 实例支持。这些问题与两个不同的适配器/加载器对有关,但在每种情况下使用的代码都是相同的:
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
问题 1:我调用了 restartLoader() 并且 LoaderManager 注册了对 onCreateLoader 的调用,但没有注册对 onLoaderReset() 的调用。Loader 到达 DeliverResult(),但永远不会调用 onLoadFinished()。Loader 没有设置“reset”或“started”标志(参见下面的代码)。
问题2:我调用restartLoader() 并且LoaderManager 注册了对onLoaderReset() 的调用。加载程序到达 onReset(),但没有进一步。Cursor 设置为 null,但没有加载新的 Cursor。
任何想法可能是什么问题?下面是 Loader 和 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);
}