我在项目中使用了很多LiveData,在那些需要将某些内容传递给视图的情况下,这非常好,因为它的意图是由生命周期所有者(即视图)观察。
但是我想知道在这种情况下,当每次数据库中的某些数据发生变化时都需要在视图模型中应用一些逻辑的情况下,我应该使用什么?
我熟悉转换(映射和切换),但是(如果我是对的话)它们只是转换liveData对象的一种方式,而不是我可以执行某些viewmodel逻辑的地方。
如果我理解正确,那么在viewModels中观察LiveData是不好的做法。 有什么选择?一些RxJava可观察类型?或者是其他东西?
答案 0 :(得分:0)
“它们只是转换liveData对象的一种方式,而不是我可以执行某些viewmodel逻辑的地方。”
是的,您是对的。这是因为:
map()和switchMap()中的函数都在主线程上运行, 所以不要在那里长时间运行操作!
但是我不认为在ViewModel中观察LiveData是不好的做法,因为在Android中,我们为此目的 MediatorLiveData 。如果您查看地图和 switchMap 函数的源代码,您会发现它们在其中使用 MediatorLiveData 。
因此,这里唯一的问题是,如果要执行的一些逻辑是一个长期运行的任务,则在观察源LiveData的更改时必须在后台线程中运行它。您可以使用Rx或类似的方法在后台线程中运行它,如下所示:
private val _downloadState = MutableLiveData<DownloadDataState>()
val downloadState: LiveData<DownloadDataState> = _downloadState
// version observe changes in downloadState
val version = MediatorLiveData<String>().apply {
addSource(downloadState) {
// Whenever value of downloadState changes, this block will run your logic
Single.just(dataRepository.fetchDataVersion())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result ->
// Then set value to the observer
value = result
},
{ e: Throwable ->
e.printStackTrace()
}
)
}
}