我目前正在大量修改/重写 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
从 LoaderCallbacks
传递到每个相应的 CursorAdapter
,我们正在注册 Cursor
以获取通知在 ContentProvider
中,我们通知来自每个 insert(...)
的 ContentResolver
, delete(...)
和 update(...)
...简而言之,我找不到 Cursor
在使用。
那么:StaleDataException
的其他原因是什么?
最佳答案
如果您正在调用 Cursor.changeCursor(newCursor),它将自动为您关闭旧游标。如果有任何东西仍在尝试访问游标,这可能会导致 android.database.StaleDataException。
关于android - 除了过早调用 cursor.close() 之外还有什么会导致 StaleDataException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14983262/