如果我需要通过HTTP(或其他)异步加载一些数据来更新UI,我在编写Android应用程序时有一些选择(在我确定我错过的许多其他应用程序中):
使用常规线程和处理程序来更新UI.
使用和IntentService,并使用回调或通过Intent广播结果.
使用装载机.
据我所知,IntentService与Activity的生命周期无关,因此对方向等的任何更改都不会影响数据的检索.这种情况不适用于在Activity中触发的AsyncTask或线程.
这个问题的原因是我刚刚读到的内容Loaders,并对其应用感到困惑.它们似乎与数据源关系更紧密,如果数据源发生变化,那么"透明地"将对所有内容进行适当处理.Loaders也似乎容忍配置/方向的变化(我相信).
我一直在使用IntentService来进行RESTful服务调用,并广播由适当的活动接收的结果.
我假设我可以写一个基于HTTP的Loader,但我不确定这是否是这种机制的最佳用法.
使用其中一种异步数据加载方法的优点/缺点是什么?
所有这些机制都只是选项。不存在万能的工具,因此完成同一任务的所有这些不同方法都是覆盖尽可能多的用例的一种方法。
最终,由您决定哪种方法对您的场景更有意义。但对于你应该使用什么的一种通用解释......
常规线程和处理程序 - 为什么有其他更简单的选项?
AsyncTask - 由于 AsyncTask 几乎总是依赖于 Activity,因此当您需要异步加载数据并且您 100% 确定可能需要多长时间时,请使用它。示例:执行 SQLite 查询。
IntentService/Service - 服务不像 AsyncTask 那样绑定到 Activity,因此,它们非常适合您可能不知道需要多长时间才能完成的场景。示例:从 Web API 下载数据并更新数据库。
加载器 - 加载器旨在简化加载数据并将其填充到 UI 中的过程。加载器的性质有点假设您将加载的数据将以某种列表的形式呈现给用户。示例:下载数据并将其填充到 ListView 中