我正在将我们的项目转换为与房间ORM一起工作。当我需要更新的livedata对象时,它非常有效,并且适用于插入,删除等的异步,我不需要回调。但是我很困惑使用需要回调的一次性查询时使用什么。这些选项是使用DAO实现来调用Asynctask查询,或与Observer一起使用Livedata,然后在第一次接收后,请解开观察者。
我建议您坚持使用Livedata,特别是如果您使用房间提供的ViewModel。在将所有房间捆绑在一起,Livedata和ViewModels捆绑在一起时,ArchitectureComponents库确实做得很好,因此请尽力坚持会议。
我建议使用 livedata 和 viewModels 是
- ViewModels是生命周期的,这意味着它们做出了适当的回应碎片/活动状态变化,否则会离开您异步攻击要么检索死活动的数据或进行工作当活动不再有可能导致记忆障碍
- 这是最佳实践(至少对于体系结构组件)以观察数据/更改数据。如果您只需要一个回调,请在收到数据后取消订阅。或使用rxjava单单,如果您当前正在使用rxjava
如果您觉得有必要真正想使用asynctask,我建议使用asynctaskloader。这是一个更强大/更强大/生命周期的背景线程操作,它将缓存您的数据(它与asynctask非常相似,因此实现详细信息不会太外国),因此,如果您旋转设备,数据将被缓存并立即可用,并且您将不会有内存泄漏。还可以在Android团队上查看此视频。
,但我建议使用带有ViewModels的Livedata。
我在房间实现方面也有同样的问题。至于 livedata 返回房间,我们可以在主线程上观察这一点,而无需在主线程上执行数据库操作。但是对于没有Livedata的原始对象,我们无法直接执行此操作,因为不允许数据库操作。
我已经使用livedata来列表,一旦数据库更新,我要尽快进行更新。但是对于某些操作,我只需要一次获取一次并停止观察数据库,因为我知道它不会改变。
就我而言,我已经使用 rxjava观察查询结果仅1次
创建可观察的用于从存储库中获取ID的用户
Observable.create(object : ObservableOnSubscribe<User> {
override fun subscribe(e: ObservableEmitter<User>) {
val user= userRepo.getUserById(currentUserId)
e.onNext(user)
e.onComplete()
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(GetCurrentUserByIdSubscriber())
存储库
fun getUserById(id: Int): User= userDao.getUserById(id)
dao
@Query("SELECT * FROM users WHERE id= :id")
fun getUserById(id: Int): User
您可以看到我正在返回普通用户对象而不是Livedata。
在我想观察此
的活动中private inner class GetCurrentUserByIdSubscriber : Observer<User> {
override fun onSubscribe(d: Disposable) {}
override fun onNext(t: User) {
// update the view after getting the data from database
user_name.text = t.name
}
override fun onComplete() {}
override fun onError(e: Throwable) {}
}
因此,这就是我可以使用rxjava在io线程上进行一次数据库获取的方式,并在从数据库中获取对象后立即获得回调。您可以在上访问 nixubscribe subscription 从subscribe()方法返回结果后。
转换中有简单的解决方案方法distinctUntilChanged
。仅在更改数据时才显示新数据。
以防万一事件行为使用以下方式:https://stackoverflow.com/a/55212795/9381524