Что может вызвать исключение 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)
Проблема в том, что мы не закрываем Cursor
s. Все наше 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();
}