如何使我的光标在方向更改后继续存在?

时间:2011-01-25 09:23:48

标签: android configuration cursor rotation

我正在努力使我的应用程序旋转友好,但是我在保存光标方面遇到了一些问题。

光标保存在ListView中显示的大约13k +行数据,因此如果每次配置更改时我都会进行重新查询,则需要很长时间。在我的onRetainNonConfigurationInstance()中,我将返回我的Cursor,然后通过getLastNonConfigurationInstance()检索它。

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

我像这样保存Cursor:

@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()后,它已经关闭。

如何让我的光标在方向更改后继续存在?谢谢你的帮助!

修改 根据罗曼的回答,我评论了我所有的startManagingCursor()。我应该连接点并思考它!无论如何,我的应用程序现在可以存活一次,但是将其翻转回原始方向仍然会崩溃。继续我的调试,让你知道我发现了什么。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

只需在清单文件

中的活动代码中添加此属性即可

机器人:configChanges = “取向| keyboardHidden”

它将解决此问题

无需实施任何其他内容

:) 它虽然帮助了我