我正在将我们的项目转换为使用 Room ORM。当我需要更新 LiveData 对象时,它工作得很好,并且对于插入、删除等 AsyncTasks,我不需要回调时工作得很好。但是当我需要一个需要回调的一次性查询时,我很困惑该用什么。选项是使用 DAO 实现调用 AsyncTask 进行查询,或使用 Observer 调用 LiveData,并在第一次接收后注销观察者。
最佳答案
我建议坚持使用 LiveData,尤其是当您使用 Room 提供的 ViewModel 时。 ArchitectureComponents 库在将所有 Room、LiveData 和 ViewModel bundle 在一起时确实做得很好,因此请尽量遵守约定。
我推荐坚持使用 LiveData 和 ViewModels 的原因是
- ViewModel 具有生命周期意识,这意味着它们会做出适当的响应 到 fragment/Activity 状态变化,否则会离开你的 AsyncTask 为死 Activity 检索数据或做工作 当 Activity 不再存在时可能会导致 MemoryLeaks
- 最好的做法是(至少对于架构组件)让 View 观察数据/数据更改。如果您只需要一个回调,请在收到数据后取消订阅。或者,如果您当前正在使用 RxJava,则使用 RxJava single
如果您真的需要使用 AsyncTask,我建议您使用 AsyncTaskLoader .这是一个更健壮/生命周期感知的后台线程操作,它将缓存您的数据(它与 AsyncTask 非常相似,因此实现细节不会太陌生),因此如果您旋转设备,数据将被缓存并立即可用,并且不会有内存泄漏。还要检查这个 Video Android 团队在加载器上。
但我建议使用带 ViewModel 的 LiveData。
关于android - Room LiveData vs AsyncTask 用于不需要更新的单个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857389/