onLoadFinished
コールバック(LoaderManager.LoaderCallbacks
)でカーソルが返されました。このカーソルで後処理を行う場合があります。だから、私はAsyncTask
このカーソルを使用して発砲しています。しかし、私はこの例外に断続的にクラッシュを取得しています:バックグラウンドスレッドがで終了する前に(UIスレッドでローダーによって管理されている)、カーソルがクローズされているので、AsyncTaskでLoaderManagerから返されたカーソルを使用する
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
私の疑惑は、これが起こっているということですこれは管理されたカーソルであるためです。
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スレッドから閉鎖されてからそれを防ぐために、カーソルをフラグ:ここではいくつかの言い換えコードです。
カーソルがまだ使用中であることをマネージャに通知します。
複製されたインスタンスがマネージャによって閉じられないように複製します。
もう1つ、さらに優れたソリューションですか?
この後処理をUIスレッドで行うことは、非常にコストがかかる可能性があるため、絶対に選択肢ではありません。
'CursorLoader'をスキップして、初期クエリ+高価な処理を' AsyncTask'で行うことができます。 – Luksprog
このカーソルを他のものに使用していますか? – njzk2