gpt4 book ai didi

android - 是否应该使用 Loader 来访问 Web 服务?

转载 作者:可可西里 更新时间:2023-11-01 18:46:47 28 4
gpt4 key购买 nike

据我了解,Loader 框架旨在访问本地存储在 ContentProvider/SQLite 数据库中的数据。我们有 CursorLoader 类可以很好地处理这个用例。

但我想知道使用 Loader 框架编写扩展 Loader/AsyncTaskLoader 的类以访问远程 Web 服务(例如 REST Web 服务)是否可行?我一直认为这个框架对于这个用例来说有点过于僵化和困惑(缺乏适当的文档)。我更喜欢使用 AsyncTasks/Services 以更常规的方式处理 REST 调用。但是最近看到一些使用了AsyncTaskLoaders的文章,开始疑惑了。

那么为什么会有人使用 Loader 来访问 Web 服务呢?我在这里看到的唯一优势是加载器会自动保留它们的结果。之后这里没有 Cursor 可以管理。

最佳答案

实际上,您可能想使用像 Volley 这样的网络库。这有一些很好的特性,比如请求批处理和图像缓存。尽管如此,为了争论起见,让我们比较一下 ServiceLoaderAsyncTask

如果您希望在更改 Activity 或后台运行您的应用程序时允许继续加载,则服务是您的不二之选。或者,如果您想导出您的服务以便多个应用程序可以使用它。否则,请使用 Loader 或 AsyncTaskLoader。

与 AsyncTasks 相比,加载器有一些优势。

  • 他们不太可能在 Activity 完成后执行代码而导致崩溃,因为他们了解 android 生命周期。
  • 该设计不鼓励引用 View 或 Activity。这减少了在 Activity 完成后强制保留在内存中的可能性。
  • 监控数据源的变化并在发生变化时触发回调
  • 他们内置了缓存,轮换后很有用。对于 CursorCursorLoader 会在正确的位置自动重新连接到上次加载的 Cursor

但是,它们也有缺点

  • 该 API 比 AsyncTask极其繁琐。特别是如果您关心与旧版 Android 的兼容性
  • 您已经在 onSaveInstanceState() 中存储了 UI 状态,因此使用 Loader 可以使您以多种方式保存状态。这可能会让人难以阅读和理解。特别是如果您最终将保留的 fragment 混合到混合物中。
  • Loader 缓存加载的结果,而不是您实际需要的 UI 状态

我假设您只是从 Web 服务中读取,而不是写入。如果您正在对 Web 服务执行更新并且您需要查看该服务的响应,那么这会改变一切。如果在轮换期间收到响应,则使用 AsyncTask 可能会阻止您获得响应。

关于android - 是否应该使用 Loader 来访问 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510734/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com