Что может вызвать исключение StaleDataException, кроме преждевременного вызова cursor.close()?

В настоящее время я сильно изменяю / переписываю приложение Android, и я видел очень случайный сбой по следующим направлениям: CursorAdapter метод вызывается, он вызывает AbstractWindowedCursor#checkPosition(), а также:

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)

Проблема в том, что мы не закрываем Cursors. Все наше Cursorс пришли CursorLoaderи, в свою очередь, производятся ContentProvider, Мы проходим Cursor в каждом соответствующем CursorAdapter от LoaderCallbacksрегистрируем Cursor для уведомлений в ContentProviderуведомляем ContentResolver с каждого insert(...), delete(...) а также update(...)... короче говоря, я не могу найти причину, почему Cursor закроется во время использования.

Итак: каковы другие причины StaleDataException?

1 ответ

Если вы вызываете Cursor.changeCursor(newCursor), это автоматически закроет старый курсор для вас. Это может вызвать android.database.StaleDataException, если что-то все еще пытается получить доступ к курсору.

Если ты позвонил Context.managedQuery() в андроиде 4.0 и выше звонить не стоит Cursor.close(), если ты так сделаешь, StaleDataException будет брошен, вы можете изменить свой код следующим образом:

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