10

Ich Modifizieren derzeit stark/eine Android-App Umschreiben und ich habe eine sehr gelegentlichen Abstürzen führte entlang der folgenden Zeilen zu sehen: ein CursorAdapter Methode, ruft AbstractWindowedCursor#checkPosition(), und heißt:Was kann StaleDataException anders als vorzeitig cursor.close() aufrufen?

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) 

Das Problem ist, wir schließe keine Cursor s. Alle unsere Cursor s kommen von CursorLoader s und werden wiederum von einem ContentProvider produziert. Wir sind die Cursor in jedem entsprechenden CursorAdapter vom LoaderCallbacks vorbei, sind wir die Cursor für Benachrichtigungen in der ContentProvider Registrierung, wir anmelde die ContentResolver von jedem insert(...), delete(...) und update(...) ... kurz gesagt, ich kann nicht Finden Sie einen Grund, warum sich ein Cursor schließen würde, während er benutzt wird.

Also: Was sind die andere Ursachen eines StaleDataException?

+0

Es ist schon eine Weile her, seit Sie gefragt, aber ... war da zufällig ein FilterQueryProvider beteiligt? –

+1

Hey Andrew! Konnten Sie die Lösung herausfinden? – TheLittleNaruto

Antwort

-2

wenn genannt Sie Context.managedQuery() in Android 4.0 und höher, sollten Sie Cursor.close() nicht nennen, wenn Sie dies tun, wird StaleDataException geworfen werden, können Sie Sie Code wie folgt ändern:

if(VERSION.SDK_INT < 14) { 
    cursor.close(); 
}