onLoadFinished
(from )のコールバックでカーソルが返され、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スレッドでこの後処理を実行することは、非常にコストがかかる可能性があるため、絶対にオプションではありません。