【发布时间】:2013-02-05 15:44:04
【问题描述】:
我目前正在大量修改/重写一个 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,反过来又由ContentProvider 产生。我们将Cursor 从LoaderCallbacks 传递到每个相应的CursorAdapter,我们在ContentProvider 中注册Cursor 以获取通知,我们正在通知@987654334 @ 来自每个insert(...)、delete(...) 和update(...) ... 简而言之,我找不到任何理由说明Cursor 在使用时会关闭。
那么:StaleDataException 的其他原因是什么?
【问题讨论】:
-
您已经有一段时间没有问过了,但是……有没有涉及到 FilterQueryProvider ?
-
嘿安德鲁!你能想出解决办法吗?
-
我认为我们从来没有明确地追踪到这一点。但是,我们确实发现使用适配器外部的
Cursor会引发这种行为,尽管(再次)我们从未调用过.close()或您认为会导致这种情况的任何方法。从那时起,如果我不得不在适配器内部和外部使用光标,我总是以类似于android.googlesource.com/platform/frameworks/base/+/master/core/…(跳到最后)的方式实现ContentObserver和DataSetObserver。
标签: android android-contentprovider android-loadermanager android-loader staledataexception