什么可能导致StaleDataException而不是过早地调用cursor.close()?

And*_*yld 12 android staledataexception android-contentprovider android-loadermanager android-loader

我目前正在大量修改/重写一个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)
Run Code Online (Sandbox Code Playgroud)

麻烦的是,我们没有关闭任何Cursors.我们所有的Cursors都来自CursorLoaders而且又是由a产生的ContentProvider.我们要传递Cursor到每个相应的CursorAdapterLoaderCallbacks,我们正在注册Cursor中的通知ContentProvider,我们通知ContentResolver从各insert(...),delete(...)update(...)......总之我找不到任何理由为什么Cursor会在使用中关闭一段时间.

那么:a 的其他原因是StaleDataException什么?

exl*_*ong -3

如果你Context.managedQuery()在android 4.0及以上版本中调用,你不应该调用Cursor.close(),如果你这样做,StaleDataException会被抛出,你可以修改你的代码如下:

if(VERSION.SDK_INT < 14) {  
    cursor.close();  
}
Run Code Online (Sandbox Code Playgroud)