我有一个光标返回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();
}
是否有可能,
以某种方式标记游标以防止它从 UI 线程中关闭。
通知经理光标仍在使用中。
克隆它,以便克隆的实例不会被管理器关闭。
另一个甚至更好的解决方案?
然而,在 UI 线程上完成此后处理绝对不是一个选择,因为它的成本可能非常高。
是否可以以某种方式标记光标以防止它从 UI 线程关闭?
不(好吧,如果不重写内部 API 就不行)。
是否可以通知管理员光标仍在使用中?
与上面的答案相同。
是否可以克隆它,以便克隆的实例不会被管理器关闭?
这听起来有点混乱……而且仍然有可能LoaderManager
在完成克隆之前关闭光标。
有更好的解决方案吗?
是的。查询一个新游标,而不是尝试重用传递给的游标LoaderManager
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)