наблюдение за живыми данными модели представления во фрагменте

Я следую шаблону MVVM в своем приложении для Android. Вот файлы, о которых я буду говорить:

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

все работает хорошо, и мой пользовательский интерфейс обновляется. Я хочу спросить, можно ли вызывать наблюдениеForever в модели представления. Если нет, то как мне удалить наблюдателя?

Если у вас есть лучший способ сделать это, пожалуйста, сообщите и об этом.

Помните, что когда я вызываю getLiveContests репозитория, а затем в репозитории, я проверяю, нужно ли получать свежие данные из Интернета или нет. в любом случае, я возвращаю LiveData из комнаты db. Если новые данные были получены, они сохраняются в комнате, и поскольку я вернул LiveData, я также получаю обновления в пользовательском интерфейсе.


person Nitin Verma    schedule 11.05.2019    source источник


Ответы (1)


наблюдатьForever можно использовать в ViewModel, но обязательно удалите наблюдателя в обратном вызове onCleared().

Для этого создайте свой собственный Observer:

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

Передайте этого наблюдателя, когда вы будете наблюдать за Forever:

 contestLiveData.observeForever(customObserver) 

Удалите наблюдателя в onCleared():

contestLiveData.removeObserver(customObserver)
person Daniel Rust    schedule 11.05.2019
comment
как убрать наблюдателя? - person Nitin Verma; 11.05.2019
comment
Я знаю, как переопределить метод, я спрашиваю, как мне удалить наблюдателя? - person Nitin Verma; 11.05.2019
comment
Я отредактировал свой ответ, примите ответ, если он поможет. - person Daniel Rust; 13.05.2019