在 AsyncTask 中使用从 LoaderManager 返回的游标

2024-01-07

我有一个光标返回onLoadFinished回调(来自LoaderManager.LoaderCallbacks),我想对此游标进行一些(可能成本高昂)后处理。所以,我要发射一个AsyncTask使用这个游标。但是,我遇到间歇性崩溃,但有以下例外:

android.database.StaleDataException: Attempted to access a cursor after it has been closed.

我怀疑发生这种情况是因为光标(由 UI 线程中的加载程序管理)在后台线程完成之前被关闭,因为这是一个托管光标。这是一些转述的代码:

private class LoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
    @Override
    public void onCreateLoader(int d, Bundle args) {
        return new CursorLoader(context, uri, projection, selection, selectionArgs, sortOrder);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        processCursor(cursor)    
    }
}

private void processCursor(final Cursor cursor) {
    new AsyncTask<Void, Void, Result> {
        @Override
        Result doInBackground(Void... params) {
            while(cursor.isAfterLast() == false) {
                // doing some costly things with cursor
            }
        }
    }.execute();
}

是否有可能,

  1. 以某种方式标记游标以防止它从 UI 线程中关闭。

  2. 通知经理光标仍在使用中。

  3. 克隆它,以便克隆的实例不会被管理器关闭。

  4. 另一个甚至更好的解决方案?

然而,在 UI 线程上完成此后处理绝对不是一个选择,因为它的成本可能非常高。


是否可以以某种方式标记光标以防止它从 UI 线程关闭?

不(好吧,如果不重写内部 API 就不行)。

是否可以通知管理员光标仍在使用中?

与上面的答案相同。

是否可以克隆它,以便克隆的实例不会被管理器关闭?

这听起来有点混乱……而且仍然有可能LoaderManager在完成克隆之前关闭光标。

有更好的解决方案吗?

是的。查询一个新游标,而不是尝试重用传递给的游标LoaderManager.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 AsyncTask 中使用从 LoaderManager 返回的游标 的相关文章

随机推荐