我看到一些关于CursorLoader
的文章,如this,但我仍然不了解使用它的特定目的。
我使用SQL和游标检索开发了应用程序。关键是它非常快。我查询并解析了光标,其中包含> 500条记录和8列几毫秒的光标。所以没有注意到旧手机上有任何延迟事件。那么为什么我需要使用它?
答案 0 :(得分:4)
表面上使用CursorLoader
来ContentProvider
查询LoaderManager.LoaderCallbacks<Cursor>
。
为了理解CursorLoader
:
它在单独的线程上加载数据。
它监视基础数据源的更新,并在检测到更改时重新查询。
现在来LoaderManager
。简单地说,LoaderManager
负责管理与Loader
或Activity
相关联的一个或多个Fragment
。每个Activity
和每个Fragment
只有一个LoaderManager
实例,负责启动,停止,保留,重新启动和销毁其Loader
。这些活动有时由客户直接发起,可以致电initLoader()
,restartLoader()
或destroyLoader()
。但是,这些事件通常由主要的Activity
/ Fragment
生命周期事件触发。例如,当Activity
被销毁时,Activity
会指示其LoaderManager
销毁并关闭其Loader
(以及与其关联的所有资源,例如Cursor
)。
LoaderManager
不知道如何加载数据,也不需要。相反,LoaderManager
指示其Loader
何时启动/停止/重置其负载,在配置更改期间保留其状态,并提供用于将结果传递回客户端的简单界面。
所以你看,当你使用简单的AsyncTask
并查询SQLite数据库时,这一切都不容易实现。这就是框架提供CursorLoader
和LoaderManager
:
Activity
和Fragment
。答案 1 :(得分:0)
实际目的只是Android如何处理UI元素(即主线程上)。基本上,任何可能都是一个长时间运行的进程,在后台线程中运行它,这样你就不会锁定主线程。这说不够。在Gingerbread之后,Android本身更加强制执行。查看SQL helper。要明确打开SQLite连接及其速度&#34;:
因为它们可以长时间运行,所以请确保在后台线程中调用getWritableDatabase()或getReadableDatabase(),例如使用AsyncTask或IntentService。
使用CursorLoader
,如果您需要ContentResolver
并使用SQLite DB,它会让您的生活更轻松。更重要的是,它在后台运行。仅仅因为你从未见过数据库锁定并不意味着它不会发生。更好的安全而不是遗憾,主线程将感谢你:))
答案 2 :(得分:0)
使用支持库中的https://github.com/laravel/laravel/blob/master/public/.htaccess在后台运行异步查询。这样,您可以确保数据加载不会导致“应用程序无响应”消息。
答案 3 :(得分:0)
CursorLoader在后台对ContentProvider运行异步查询,然后将结果返回到Activity或Fragment所在的片段。 主要优点是,当查询仍在后台运行时,它可以帮助用户与Activity或Fragment进行交互。