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
负责管理与 Activity
或 Fragment
关联的一个或多个 Loader
。每个 Activity
和每个 Fragment
都有一个 LoaderManager
实例负责启动、停止、保留、重新启动和销毁其 Loader
。这些事件有时由客户端通过调用 initLoader()
、restartLoader()
或 destroyLoader()
直接发起。然而,这些事件通常由主要的 Activity
/Fragment
生命周期事件触发。例如,当 Activity
被销毁时,Activity
指示其 LoaderManager
销毁并关闭其 Loader
(以及与它们关联的任何资源,例如Cursor
).
LoaderManager
不知道数据是如何加载的,也不需要。相反,LoaderManager
指示它的 Loader
何时 start/stop/reset 它们的负载,在配置更改时保持它们的状态,并提供一个简单的接口来将结果返回给客户端。
所以你看,当你使用一个简单的 AsyncTask
并查询 SQLite 数据库时,所有这一切都不容易实现。这就是为什么框架提供 CursorLoader
和 LoaderManager
:
- 在单独的线程上执行查询。
- 监视数据源的变化并更新 UI。
- 与
Activity
和 Fragment
的生命周期轻松集成。
使用支持库中的 CursorLoader
在后台进行 运行 异步查询。通过这种方式,您可以确保数据加载不会导致“应用程序无响应”消息。
CursorLoader 在后台针对 ContentProvider 运行异步查询,然后 returns 结果返回到 Activity 或调用它的 Fragment。
主要优点是它可以帮助用户在查询仍在后台 运行 时与 Activity 或 Fragment 进行交互。
我看过一些关于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
负责管理与 Activity
或 Fragment
关联的一个或多个 Loader
。每个 Activity
和每个 Fragment
都有一个 LoaderManager
实例负责启动、停止、保留、重新启动和销毁其 Loader
。这些事件有时由客户端通过调用 initLoader()
、restartLoader()
或 destroyLoader()
直接发起。然而,这些事件通常由主要的 Activity
/Fragment
生命周期事件触发。例如,当 Activity
被销毁时,Activity
指示其 LoaderManager
销毁并关闭其 Loader
(以及与它们关联的任何资源,例如Cursor
).
LoaderManager
不知道数据是如何加载的,也不需要。相反,LoaderManager
指示它的 Loader
何时 start/stop/reset 它们的负载,在配置更改时保持它们的状态,并提供一个简单的接口来将结果返回给客户端。
所以你看,当你使用一个简单的 AsyncTask
并查询 SQLite 数据库时,所有这一切都不容易实现。这就是为什么框架提供 CursorLoader
和 LoaderManager
:
- 在单独的线程上执行查询。
- 监视数据源的变化并更新 UI。
- 与
Activity
和Fragment
的生命周期轻松集成。
使用支持库中的 CursorLoader
在后台进行 运行 异步查询。通过这种方式,您可以确保数据加载不会导致“应用程序无响应”消息。
CursorLoader 在后台针对 ContentProvider 运行异步查询,然后 returns 结果返回到 Activity 或调用它的 Fragment。 主要优点是它可以帮助用户在查询仍在后台 运行 时与 Activity 或 Fragment 进行交互。