观察片段中视图模型的实时数据

时间:2019-05-11 03:03:53

标签: android mvvm android-livedata android-viewmodel android-mvvm

我正在我的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中获得更新。

1 个答案:

答案 0 :(得分:0)

observeForever可以在ViewModel中使用,但是请确保在onCleared()回调中删除观察者。

为此,请创建自己的观察者:

 var customObserver: Observer<Results> = Observer { results ->
        results ?: return@Observer
        viewModel.showResults(results)
    }

在您永远观察时让该观察者进入:

 contestLiveData.observeForever(customObserver) 

在onCleared()中删除观察者:

contestLiveData.removeObserver(customObserver)