是否应该使用加载器访问Web服务?

15
据我所理解,Loader框架旨在访问存储在ContentProvider/SQLite数据库中的本地数据。我们有CursorLoader类可以很好地处理这种情况。
但我想知道是否实用使用Loader框架编写扩展Loader/AsyncTaskLoader的类来访问远程Web服务(例如REST Web服务)?我一直认为这个框架对于这种情况来说有点过于死板和混乱(缺乏适当的文档)。我更喜欢以更常规的方式处理REST调用,使用AsyncTasks/Services。但最近我发现了一些使用AsyncTaskLoaders的文章,开始感到疑惑。
那么为什么会有人使用Loader来访问Web服务呢?我唯一看到的优势是Loader会自动保留其结果。这里没有Cursor需要管理。

你能分享一下你所提到的教程吗? - Brian Attwell
请查看此链接:http://neilgoodman.net/2011/12/26/modern-techniques-for-implementing-rest-clients-on-android-4-0-and-below-part-1/ - Zsombor Erdődy-Nagy
2个回答

12

实际上,你可能想使用像 Volley 这样的网络库。它有一些不错的功能,如请求批处理和图像缓存。尽管如此,为了讨论的缘故,让我们比较下 Service、Loader 和 AsyncTask。

如果您想在更改活动或后台应用程序时允许加载继续进行,或者如果您想导出服务以供多个应用程序使用,则可以使用服务。否则,请使用 Loader 或 AsyncTaskLoader。

与 AsyncTask 相比,Loader 有一些优势。

  • 它们不太可能通过在 Activity 结束后执行代码来导致崩溃,因为它们知道 Android 生命周期。
  • 该设计不鼓励引用 View 或 Activity。这减少了强制 Activity 在已经完成后仍然保持在内存中的可能性。
  • 监视数据源的变化并在发生变化时触发回调
  • 它们具有内置缓存,可在旋转后很有用。对于 Cursor,CursorLoader 自动重新连接到最后一个已加载的 Cursor 的正确位置

但是,它们也有缺点

  • 与 AsyncTask 相比,其 API 更加复杂。特别是如果您关心与旧版本的 Android 兼容性
  • 您已经将 UI 状态存储在 onSaveInstanceState() 中,因此使用 Loader 会使您以多种方式保存状态。这可能很难阅读和理解。特别是如果您最终将保留片段混合在一起。
  • Loader 缓存的是已加载的结果,而不是您实际需要的 UI 状态

我假设您只是从 Web 服务中读取数据,而不是写入。如果您要对 Web 服务执行更新并且需要查看服务的响应,则情况会有所改变。如果在旋转期间接收到响应,使用 AsyncTask 可能会防止您获得响应。


2
有些情况下,Loader适用于Web服务:当您的服务器可以向客户端发送推送通知以通知数据已更改时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接