10

我目前大量修改/改写一个Android应用程序,我已经看到了大意如下的一个非常偶然的碰撞:一个CursorAdapter方法被调用,它调用AbstractWindowedCursor#checkPosition()和:除了提前调用cursor.close()之外,什么原因会导致StaleDataException?

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 s。我们所有的Cursor s来自CursorLoader s,而转而由ContentProvider生产。我们经过Cursor到每个相应的CursorAdapterLoaderCallbacks,我们注册Cursor的通知在ContentProvider,我们通知ContentResolver从每个insert(...)delete(...)update(...) ...总之我不能找到在使用中为什么Cursor会关闭的任何原因。

那么:其他原因是StaleDataException

+0

它已经因为你一会儿问,但......有没有涉及FilterQueryProvider,有任何机会? – 2014-05-09 15:57:22

+1

嘿安德鲁!你能找出解决方案吗? – TheLittleNaruto 2016-08-25 11:15:53

回答

-2

,如果你在Android 4.0以上叫Context.managedQuery(),你不应该叫Cursor.close(),如果你这样做,StaleDataException将被抛出,您可以修改代码如下:

if(VERSION.SDK_INT < 14) { 
    cursor.close(); 
} 
相关问题