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

时间:2013-02-20 15:12:40

标签: android android-contentprovider android-loadermanager android-loader 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)

麻烦的是,我们没有关闭任何Cursor。我们Cursor的所有内容都来自CursorLoader,而ContentProvider则来自Cursor。我们将CursorAdapter传递到LoaderCallbacks中的每个Cursor,我们正在ContentProvider注册ContentResolver通知,我们是< em>通知 insert(...)delete(...)update(...)中的Cursor ...简而言之,我找不到{{1}的原因在使用时会关闭。

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

2 个答案:

答案 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();  
}