我目前正在大量修改/重写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
。我们Cursor
的所有内容都来自CursorLoader
,而ContentProvider
则来自Cursor
。我们将CursorAdapter
传递到LoaderCallbacks
中的每个Cursor
,我们正在ContentProvider
注册ContentResolver
通知,我们是< em>通知 insert(...)
,delete(...)
和update(...)
中的Cursor
...简而言之,我找不到{{1}的原因在使用时会关闭。
那么:StaleDataException
的其他原因是什么?
答案 0 :(得分:1)
如果您正在调用Cursor.changeCursor(newCursor),它将自动为您关闭旧光标。如果仍然尝试访问游标,则可能导致android.database.StaleDataException。
答案 1 :(得分:-3)
如果您在Android 4.0及更高版本中调用Context.managedQuery()
,则不应调用Cursor.close()
,如果您这样做,StaleDataException
将被抛出,您可以修改代码如下:< / p>
if(VERSION.SDK_INT < 14) {
cursor.close();
}