10

Jestem obecnie w dużym stopniu modyfikowanie/przepisywanie aplikację na Androida i widziałem bardzo sporadyczne awarii wzdłuż następujących linii: metoda CursorAdapter nazywa, wywołuje AbstractWindowedCursor#checkPosition() oraz:Co może spowodować, że StaleDataException będzie inne niż przedwcześnie wywoływanie cursor.close()?

02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method. 
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139) 
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74) 
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106) 
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220) 

Kłopot w tym, że "Nie zamykaj żadnego s. Cursor. Wszystkie nasze Cursor s pochodzą z CursorLoader s, a z kolei są produkowane przez ContentProvider. Jesteśmy przekazując Cursor do każdego odpowiedniego CursorAdapter z LoaderCallbacks, jesteśmy rejestracji Cursor powiadomień w ContentProvider, jesteśmy powiadamianiaContentResolver z każdej insert(...), delete(...) i update(...) ... krótko mówiąc nie mogę znajdź jakikolwiek powód, dla którego Cursor zostanie zamknięty podczas używania.

A więc: jakie są inne przyczyny dla StaleDataException?

+0

Minęło trochę czasu od ciebie zapytał, ale czy był tam jakiś przypadek FilterQueryProvider? –

+1

Hej, Andrew! Czy byłeś w stanie znaleźć rozwiązanie? – TheLittleNaruto

Odpowiedz

-2

jeśli nazywa Context.managedQuery() w Android 4.0 i wyżej, nie należy nazywać Cursor.close(), jeśli to zrobisz, StaleDataException zostanie wyrzucony, można zmodyfikować twój kod następująco:

if(VERSION.SDK_INT < 14) { 
    cursor.close(); 
} 
Powiązane problemy