наблюдение в реальном времени данных модели представления в фрагменте - PullRequest
0 голосов
/ 11 мая 2019

Я следую схеме 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
    }
  })
}

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

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

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

1 Ответ

0 голосов
/ 11 мая 2019

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

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

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

Passэтот наблюдатель, когда вы наблюдаете Forever:

 contestLiveData.observeForever(customObserver) 

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

contestLiveData.removeObserver(customObserver)
...