android – 除了过早调用cursor.close()之外,什么可能导致StaleDataException?

我目前正在大量修改/重写 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)

麻烦的是,我们没有关闭任何游标.我们所有的游标来自CursorLoaders,而后者则由ContentProvider生成.我们将CursorAdapter从LoaderCallbacks传递到每个相应的CursorAdapter中,我们在ContentProvider中注册Cursor for Notification,我们从每个插入(…),delete(…)和update(…)中通知ContentResolver …)简而言之,我在使用中找不到任何光标关闭的原因.

那么,StaleDataException的其他原因是什么?

解决方法

如果您在android 4.0及更高版本中调用了Context.managedQuery(),则不应该调用Cursor.close(),否则StaleDataException将被抛出,您可以修改代码如下:
if(VERSION.SDK_INT < 14) {  
    cursor.close();  
}

相关文章

ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ...
使用Flutter自带的SearchDelegate组件实现搜索界面,通过魔改...
上篇文章讲解了怎么使用Kotlin的协程配合Retrofit发起网络请...
安卓开发——WebView+Recyclerview文章详情页,解决高度...
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...