12

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

问题是,我们没有关闭任何Cursors。我们所有的Cursors 都来自CursorLoaders ,反过来又是由 a 产生的ContentProvider。我们从 中Cursor分别传递到每个中,我们在 中注册通知,我们从每个中通知,并且...简而言之,我找不到任何理由说明 a在使用时会关闭。CursorAdapterLoaderCallbacksCursorContentProviderContentResolverinsert(...)delete(...)update(...)Cursor

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

4

2 回答 2

1

如果您正在调用 Cursor.changeCursor(newCursor),它将自动为您关闭旧光标。如果仍有任何东西试图访问游标,这可能会导致 android.database.StaleDataException。

于 2019-01-06T01:40:42.220 回答
-3

if you called Context.managedQuery() in android 4.0 and above, you should not call Cursor.close(), if you do so, StaleDataException will be thrown, you can modify you code as follow:

if(VERSION.SDK_INT < 14) {  
    cursor.close();  
}
于 2014-05-18T11:32:53.313 回答