6

我的 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);
}
4

2 回答 2

1

您所说的“LoaderManager”实际上是LoaderManager.LoaderCallbacks<D>接口的实现。您可能想使用不同的名称,这个名称令人困惑。为什么是单例?它通常与 Activity 或 Fragment 相关联,可能只是实现接口的 Activity/Fragment。你在哪里创建你的加载器(活动/片段)?还要确保您调用LoaderManager.initLoader()from onCreate()/onActivityCreated(),否则加载程序可能无法正常启动。

于 2011-08-23T02:45:59.093 回答
0

当您创建游标并将其指向数据库时,您不能将其设置为空。您必须显式关闭游标,否则它将锁定数据库直到超时。

我建议利用 Android 生命周期和您现有的回调来实施此修复。

希望这可以帮助!

于 2011-08-22T20:47:31.873 回答