我正在我的android应用程序中遵循MVVM模式。以下是我将要讨论的文件:
PresentContestsFragment
PresentContestsViewModel
这是我的视图模型代码:
private val _contests = MutableLiveData<List<ContestsShortInfoModel>>()
val contests:LiveData<List<ContestsShortInfoModel>>
get() = _contests
fun getContests() {
viewModelScope.launch{
val contestLiveData = repository.getLiveContests()
contestLiveData.observeForever {
_contests.value = it
}
}
}
这是我的片段类代码
在onActivityCreated中,我调用viewModel.getContests(),然后调用bindUI()
private fun bindUI() {
viewModel.contests.observe(this, Observer { list ->
list?.let{
// show this list in UI
}
})
}
一切正常,我的UI正在更新。我想问一下在视图模型中调用observeForever是否可以。如果没有,我应该如何删除观察者?
如果您有更好的方法,也请告知。
请记住,当我调用存储库的getLiveContests然后在回购中时,我检查是否需要从Internet获取最新数据。无论如何,我都从room db返回LiveData。如果获取了新数据,则将其保存到房间中,并且当我返回LiveData时,我也在UI中获得更新。
答案 0 :(得分:0)
observeForever可以在ViewModel中使用,但是请确保在onCleared()回调中删除观察者。
为此,请创建自己的观察者:
var customObserver: Observer<Results> = Observer { results ->
results ?: return@Observer
viewModel.showResults(results)
}
在您永远观察时让该观察者进入:
contestLiveData.observeForever(customObserver)
在onCleared()中删除观察者:
contestLiveData.removeObserver(customObserver)