9

我正在尝试使我的应用程序旋转友好,但我在保存光标时遇到了一些问题。

光标包含在 a 中显示的大约 13k+ 行数据ListView,因此如果我每次配置更改时都进行重新查询,则需要相当长的时间。在我的onRetainNonConfigurationInstance()中,我正在返回我的光标,然后通过getLastNonConfigurationInstance().

但是,我检索到的光标似乎已经关闭,因此我的适配器无法再呈现列表。据我了解,游标已关闭,因为onDestroy()自动关闭了所有游标。

我像这样保存光标:

@Override
public Object onRetainNonConfigurationInstance() {
    return myCursor;
}

并像这样检索它:

myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
    // Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
    // Feed the cursor to the adapter
}

如果有人想查看它,我将粘贴堆栈跟踪:

01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]

我单步执行了代码,发现就 而言onRetainNonConfigurationInstance(),光标仍然是打开的,但是在通过getLastNonConfigurationInstance()它之后它已经关闭了。

我怎样才能让我的光标在方向变化中幸存下来?感谢您的帮助!

编辑: 根据 Romain 的回答,我注释掉了我所有的startManagingCursor()s. 我应该把这些点联系起来并考虑一下!无论如何,我的应用程序现在可以旋转一圈,但将其翻转回原始方向仍然会使它崩溃。继续我的调试,会让你知道我发现了什么。

EDIT2: 我想我可能已经找到导致新错误的原因。我已经实现了一个FilterQueryProvider返回新光标的方法。我所做的是将该过滤器的结果分配给我的原始光标。到目前为止似乎工作。

4

2 回答 2

4

您可能正在使用托管游标。当 Activity 被销毁时,托管游标会自动关闭。您应该切换到非托管游标。

于 2011-01-25T09:29:28.530 回答
0

只需在清单文件的活动标记中添加此属性

android:configChanges="orientation|keyboardHidden"

它会解决这个问题

无需执行任何其他操作

:) 虽然它帮助了我

于 2011-01-25T09:33:51.510 回答