android - Room LiveData vs AsyncTask 用于不需要更新的单个查询

标签 android android-asynctask android-room android-livedata

我正在将我们的项目转换为使用 Room ORM。当我需要更新 LiveData 对象时,它工作得很好,并且对于插入、删除等 AsyncTasks,我不需要回调时工作得很好。但是当我需要一个需要回调的一次性查询时,我很困惑该用什么。选项是使用 DAO 实现调用 AsyncTask 进行查询,或使用 Observer 调用 LiveData,并在第一次接收后注销观察者。

最佳答案

我建议坚持使用 LiveData,尤其是当您使用 Room 提供的 ViewModel 时。 ArchitectureComponents 库在将所有 Room、LiveData 和 ViewModel bundle 在一起时确实做得很好,因此请尽量遵守约定。

我推荐坚持使用 LiveDataViewModels 的原因是

  1. ViewModel 具有生命周期意识,这意味着它们会做出适当的响应 到 fragment/Activity 状态变化,否则会离开你的 AsyncTask 为死 Activity 检索数据或做工作 当 Activity 不再存在时可能会导致 MemoryLeaks
  2. 最好的做法是(至少对于架构组件)让 View 观察数据/数据更改。如果您只需要一个回调,请在收到数据后取消订阅。或者,如果您当前正在使用 RxJava,则使用 RxJava single

如果您真的需要使用 AsyncTask,我建议您使用 AsyncTaskLoader .这是一个更健壮/生命周期感知的后台线程操作,它将缓存您的数据(它与 AsyncTask 非常相似,因此实现细节不会太陌生),因此如果您旋转设备,数据将被缓存并立即可用,并且不会有内存泄漏。还要检查这个 Video Android 团队在加载器上。

但我建议使用带 ViewModel 的 LiveData。

关于android - Room LiveData vs AsyncTask 用于不需要更新的单个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857389/

相关文章:

android - 从小部件启动时, Activity 未显示在最近的应用程序列表中

java - android使用asynctask解析json

android - 通过 Arraylist 在数据库中插入数据列表

java - 房间数据库强制 OnCreate 回调

android - OrmLite 和 greenDAO 是否在后台线程中执行查询并将结果部分加载到内存中?

java - 如何在 Android 中的联系人数据库上设置触发器

android - 谷歌分析 : how to report user scope custom dimentions

java - 从 AsyncTask 返回对象时出现问题

android - 进度对话框 - AsyncTask

android - 如何查询 Room 数据库以使其返回单个对象?