首页 > 解决方案 > 观察片段中视图模型的实时数据

问题描述

我在我的 android 应用程序中遵循 MVVM 模式。以下是我将要讨论的文件:

这是我的视图模型代码:

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
    }
  })
}

一切正常,我的用户界面正在更新。我想问在视图模型中调用observeForever是否可以。如果不是,我应该如何删除观察者?

如果您有更好的方法来做到这一点,也请告诉。

请记住,当我在 repo 中调用存储库的 getLiveContests 时,我会检查是否需要从 Internet 获取新数据。无论如何,我从房间数据库返回 LiveData。如果获取了新数据,则会将其保存到房间中,并且由于我已返回 LiveData,因此我也会在 UI 中获得更新。

标签: androidmvvmandroid-livedataandroid-viewmodelandroid-mvvm

解决方案


observeForever 可以在 ViewModel 中使用,但一定要在 onCleared() 回调中移除观察者。

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

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

当你observeForever时传入这个观察者:

 contestLiveData.observeForever(customObserver) 

移除 onCleared() 中的观察者:

contestLiveData.removeObserver(customObserver)

推荐阅读