cursorLoader 的实际用途是什么?

What's practical purpose of cursorLoader?

我看过一些关于CursorLoader的文章,比如this,但我还是不明白使用它的具体目的。

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

实际目的只是 Android 如何处理 UI 元素(在主线程上)。基本上,任何 可能 是一个较长的 运行ning 进程,运行 它在后台线程中,因此您不会锁定主线程。这不能说不够。在 Gingerbread 之后,Android 本身更加强了这一点。查看 SQL helper。了解关于打开 SQLite 连接及其 "speed":

的要点

Because they can be long-running, be sure that you call getWritableDatabase() or getReadableDatabase() in a background thread, such as with AsyncTask or IntentService.

通过使用 CursorLoader,如果您需要 ContentResolver 并且正在使用 SQLite DB,它会让您的生活更轻松。更重要的是,它 运行 在背景中。仅仅因为您从未见过数据库锁定并不意味着它不会发生。安全总比后悔好,主线程会感谢你:)

一个CursorLoader is used ostensibly to query a ContentProvider with LoaderManager.LoaderCallbacks<Cursor>.

要理解 CursorLoader,您需要牢记两点:

  • 它在单独的线程上加载数据。

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

现在来到 LoaderManager。简单地说,LoaderManager 负责管理与 ActivityFragment 关联的一个或多个 Loader。每个 Activity 和每个 Fragment 都有一个 LoaderManager 实例负责启动、停止、保留、重新启动和销毁其 Loader。这些事件有时由客户端通过调用 initLoader()restartLoader()destroyLoader() 直接发起。然而,这些事件通常由主要的 Activity/Fragment 生命周期事件触发。例如,当 Activity 被销毁时,Activity 指示其 LoaderManager 销毁并关闭其 Loader(以及与它们关联的任何资源,例如Cursor).

LoaderManager 不知道数据是如何加载的,也不需要。相反,LoaderManager 指示它的 Loader 何时 start/stop/reset 它们的负载,在配置更改时保持它们的状态,并提供一个简单的接口来将结果返回给客户端。

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

  • 在单独的线程上执行查询。
  • 监视数据源的变化并更新 UI。
  • ActivityFragment 的生命周期轻松集成。

使用支持库中的 CursorLoader 在后台进行 运行 异步查询。通过这种方式,您可以确保数据加载不会导致“应用程序无响应”消息。

CursorLoader 在后台针对 ContentProvider 运行异步查询,然后 returns 结果返回到 Activity 或调用它的 Fragment。 主要优点是它可以帮助用户在查询仍在后台 运行 时与 Activity 或 Fragment 进行交互。