cursorLoader的实际用途是什么?

时间:2015-02-20 20:07:52

标签: android android-sqlite android-cursor android-cursorloader

我看到一些关于CursorLoader的文章,如this,但我仍然不了解使用它的特定目的。

我使用SQL和游标检索开发了应用程序。关键是它非常快。我查询并解析了光标,其中包含> 500条记录和8列几毫秒的光标。所以没有注意到旧手机上有任何延迟事件。那么为什么我需要使用它?

4 个答案:

答案 0 :(得分:4)

表面上使用CursorLoaderContentProvider查询LoaderManager.LoaderCallbacks<Cursor>

为了理解CursorLoader

,您需要记住两件事
  • 它在单独的线程上加载数据。

  • 它监视基础数据源的更新,并在检测到更改时重新查询。

现在来LoaderManager。简单地说,LoaderManager负责管理与LoaderActivity相关联的一个或多个Fragment。每个Activity和每个Fragment只有一个LoaderManager实例,负责启动,停止,保留,重新启动和销毁其Loader。这些活动有时由客户直接发起,可以致电initLoader()restartLoader()destroyLoader()。但是,这些事件通常由主要的Activity / Fragment生命周期事件触发。例如,当Activity被销毁时,Activity会指示其LoaderManager销毁并关闭其Loader(以及与其关联的所有资源,例如Cursor)。

LoaderManager不知道如何加载数据,也不需要。相反,LoaderManager指示其Loader何时启动/停止/重置其负载,在配置更改期间保留其状态,并提供用于将结果传递回客户端的简单界面。

所以你看,当你使用简单的AsyncTask并查询SQLite数据库时,这一切都不容易实现。这就是框架提供CursorLoaderLoaderManager

的原因
  • 在单独的线程上执行查询。
  • 监控数据源以进行更改并更新UI。
  • 轻松整合ActivityFragment
  • 的生命周期

答案 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进行交互。