onLoadFinished
콜백 (LoaderManager.LoaderCallbacks
)에서 커서가 반환되었으며이 커서에서 약간의 (값 비싼) 후가공 작업을 수행하려고합니다. 그래서이 커서를 사용하는 AsyncTask
을 발사하고 있습니다. 그러나, 나는이 예외에 간헐적 인 충돌을 받고 있어요 :AsyncTask에서 LoaderManager에서 반환 된 커서 사용
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 스레드에서이 포스트 프로세싱을 수행하는 것은 비용이 많이들 수 있으므로 절대적으로 선택 사항이 아닙니다.
'CursorLoader'를 건너 뛰고 초기 쿼리 + 비싼 처리를'AsyncTask '에서 수행 할 수 있습니다. – Luksprog
이 커서를 다른 용도로 사용하고 있습니까? – njzk2