如何从managedQuery转换到LoaderManager/CursorLoader?

15
我正在开发一个针对API级别8(2.2,Froyo)的Android应用程序。我正在使用 ContentProvider ,这很简单,而且我正在使用 SimpleCursorAdapter 来填充我的列表视图。但是我注意到在 SimpleCursorAdapter 的文档中,无标志的构造函数已经被弃用,并附带以下说明:
此构造函数已弃用。 不推荐使用此选项,因为它会导致在应用程序的UI线程上执行 Cursor 查询,从而可能导致响应速度变慢甚至出现“应用未响应”错误。作为替代方案,请使用带有 CursorLoader 的 LoaderManager。
由于我正在针对API级别8进行开发,因此 LoaderManagerActivity 没有绑定关系。兼容包中的 FragmentActivity 类可以实现此功能,但我没有使用 Fragments。
我有一个问题:在针对API级别低于11的应用程序中,我应该如何使用 LoaderManager/CursorLoader?我是否强制要过渡到Fragments,或者只需回退到已弃用的SimpleCursorAdapter构造函数(但使用AsyncTask保持它UI线程友好,这就是CursorLoader的作用)?

1
请查看这篇博客文章:了解LoaderManager(第二部分) - Adrian Monk
你好,LoaderManager与Fragment绑定的文档在哪里可以找到?它只是用于从数据库检索数据。在任何复杂的软件范例中,模型层始终与UI层分离。 - IgorGanapolsky
在LoaderManager的文档中:“与Activity或Fragment相关联的接口,用于管理与其关联的一个或多个Loader实例。这有助于应用程序与Activity或Fragment生命周期一起管理长时间运行的操作。”...而与旧平台相关联的唯一类型的Activity是FragmentActivity。 - mkuech
没错,用户问道:“我必须要转换到Fragments吗?” 答案是否定的。对于这些目的,普通的Activity也可以很好地工作。 - IgorGanapolsky
1
@IgorGanapolsky 对,但仅适用于后片段API。您不必转换为“Fragment”,但至少必须转换为支持“Fragment”的“Activity”(这很简单)。并不是不同意,只是为了让任何人仍在支持GB或更早版本的情况更清楚。 - mkuech
1个回答

23

编辑:

我在这篇博客文章中比较详细地介绍了LoaderManager。看一下,如果有帮助的话,请告诉我!:)


原始帖子:

一定要使用LoaderManagerCursorLoader类将加载数据的工作卸载到线程上,并在短期活动刷新事件(如方向更改)期间保持数据持久性。除了执行最初的查询外,CursorLoader还向您请求的数据集注册ContentObserver并在数据集更改时调用forceLoad()自动更新。这非常方便,因为您不必担心自己执行查询。当然,可以利用AsyncTask使应用程序UI线程友好,但这将涉及更多的代码……并且实现您的类,以便例如在Activity中保留已加载的Cursor不会很简单。底线是,LoaderManager / Loader将自动为您完成此操作,并负责根据Activity生命周期正确创建和关闭Cursor

要在面向低于11的API级别的应用程序中使用LoaderManager/CursorLoader,只需使用兼容包中的FragmentActivity类即可。 FragmentActivity只是一个Activity,旨在支持Android兼容性,并不需要在应用程序中使用Fragment。只需使用getSupportLoaderManager()而不是getLoaderManager()即可完成设置。当然,您可以为每个屏幕实现一个父FragmentActivity,并在活动的onCreate()方法中使用FragmentActivity.getSupportFragmentManager()显示其布局中的Fragment。如果您决定优化应用程序以适应平板电脑,则此设计可能使过渡到多窗格布局更加容易。这也是一个很好的学习经验:)。
这也是一个相当不错的教程。尝试跟着做一遍,如果有任何其他问题,请不要犹豫留下评论。

请注意,我发布的教程中有一个错别字。除此之外,它非常棒! :) - Alex Lockwood
1
没有什么伤害,但您失去了使用LoaderManager的所有好处。对于更大的屏幕,查询单独线程变得更加重要,因为配置更改涉及重新创建整个视图布局(在平板电脑上不希望任何内容阻止此操作,因为布局通常更复杂)。无论如何,您都可以使用AsyncTask实现自己的类以在单独的线程上执行此操作,就像我之前提到的那样,但我的观点是LoaderManager为您完成所有这些操作(并管理游标),因此非常方便,而且很容易让它工作。 - Alex Lockwood
你具体是在尝试设置什么,结果出现了空白? - Alex Lockwood
本教程假定您已经完成了此教程,这也许可以解释您的困惑。 - Alex Lockwood
教程在第三步中非常混乱,因为它说到了对onCreate()方法的更改,但是它并没有在任何地方提到FragmentActivity。@AlexLockwood 我不会说这是最好的教程,它肯定需要编辑。但是我给你点赞。 - Gaurav Agarwal
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接