6

为了在我的应用程序中实现数据库访问,我遵循了Lars Vogel 教程,但我对一些事情感到非常困惑......

  1. 每次调用fetchTodo新游标时都会创建并返回。将前一个光标留给垃圾收集器。所以,如果我不使用startManagingCursor甚至不使用CursorLoader,我应该在完成后调用.close()光标上的 a 吗?当然,超出fetchTodo范围,例如:

    光标 cursor = mNotesAdapter.fetchTodo(); // 做点什么... cursor.close();

我已经完成了这个游标,并且将在下一次获取时创建新的游标,我应该像这样关闭它还是应该将它留给垃圾收集器?虽然我认为我在谈论两件完全不同的事情......重点是,我应该像上面的例子那样关闭它吗?

  1. Cursor也有一个.deactivate()方法,文档说它使用更少的资源(比活动游标)。我应该什么时候使用这个?例如,在我的应用程序中,我有一个ListActivity通过 a 填充的 a SimpleCursorAdapter(为此的代码初始化只调用一次)。正在使用的游标是一个类成员变量,因为我需要它在填充列表的方法之外。当从数据库中删除某些内容时,我需要它来重新查询数据库。但是在删除记录之前,这是用户操作并且可能需要一段时间才能发生,我是否应该同时停用光标?因为当我再次调用时它会再次激活.requery()。还是SimpleCursorAdapter因为光标不活动而停止工作?

编辑:我刚刚测试了这个,发现deactivate()设置光标适配器后我无法调用。如果光标未处于活动状态,则列表将为空,因此只要显示 ListActivity,它就需要保持活动状态。最后,我们应该让它StartManagingCursor处理它。或者新的CursorLoader.

  1. 我知道startManagingCursor/stopManagingCursor已被弃用,但我不是针对 Honeycomb(至少目前是这样),我现在不想处理新CursorLoader的。但是在上面的教程中,startManagingCursor到处都使用,但从stopManagingCursor不调用一次。为什么不?Android 是否以自己的方式处理这个问题?有什么情况我应该打电话stopManagingCursor吗?
4

1 回答 1

9

编辑:更新答案以反映更新的问题 1:

1) 每次调用 fetchTodo 时,都会创建并返回一个新游标。将前一个光标留给垃圾收集器。所以,如果我不使用 startManagingCursor 甚至 CursorLoader ,我应该在完成后调用光标上的 .close() 吗?

是的,您绝对应该告诉 Android自己startManagingCursor()使用LoaderManager/CursorLoaderclose()它。不这样做会泄漏内存,GC 将无济于事,因为背后有本机资源Cursor(例如数据库的文件句柄)。

2)Cursor 也有一个 .deactive() 方法,文档说它使用更少的资源(比活动游标)。我应该什么时候使用这个?...

编辑给其他读者: OP 找到了答案并将其发布在他的问题中。以下仍然成立:

我从来没有使用过deactivate()(没有deactive()),也许其他人可以解释一下。如果您想要真正轻松的重新查询/更新,请查看LoaderManager框架——它不仅适用于 Honeycomb:使用兼容库,您可以使用LoaderManager(和Fragments)低至 Android 1.6。它不仅减少了您编写的代码,而且将这些东西完全卸载到了 Android 上,比startManagingCursor().

EDIT2:关于LoaderManager

developer.android.com 上有LoaderManager教程,但这些教程非常复杂,第一次像那里的大多数教程一样难以理解。我也不得不挖掘很多,到目前为止我发现的最好的一站式服务是http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/(加上所有的 javadocs 和 compat lib 源你可以找到) ---LoaderManager工作方式非常类似于(现在也已弃用,替换为DialogFragment)托管对话框onCreateDialogonPrepareDialog其中您只需告诉 Android“显示对话框 #123”,然后 Android 使用该 ID 调用您的代码; 加载器也一样:“加载加载器 #123”,Android 调用onCreateLoader().

唯一明显的缺点是最初LoaderManager严重依赖ContentProvider框架,有些人似乎真的不喜欢它。当然,这是额外的学习和代码,但是一旦您拥有ContentProvider自己的数据(即使只是在您的应用程序中私下使用),所有数据到视图的绑定都是轻而易举的CursorLoader. 恕我直言,推出自己的“内容提供者”和实际实施之间几乎没有区别ContentProvider——但这只是我极具争议的观点:)

3) 我知道 startManagingCursor/stopManagingCursor 已被弃用,但我的目标不是 Honeycomb(至少目前是这样),我现在不想处理新的 CursorLoader。但是在上面的教程中,startManagingCursor 到处都用到了,但是 stopManagingCursor 从来没有被调用过一次。为什么不?Android 是否以自己的方式处理这个问题?任何情况我都应该调用 stopManagingCursor?

一旦你打电话不再是你的问题startManagingCursor()。当您被破坏时(用户导航离开,方向改变......),CursorAndroid 将负责关闭光标。Activity没有必要将调用startManagingCursor()与调用相匹配——一旦你摆脱了它,stopManagingCursor()你通常不想承担再次管理它的负担。Cursor

于 2011-09-29T21:40:20.983 回答