То, как я настроил свое приложение, заключается в том, что Услуга будет получать некоторую информацию в фоновом режиме, которую необходимо получить в реальном времени с помощью Фрагмент, а затем отобразить ее в представлении. Для этого Я помещаю данные в ViewModel и позволяю моему фрагменту наблюдать за LiveData в ViewModel.
Проблема в том, что у меня возникла проблема установка/изменение LiveData внутри класса ViewModel из службы. Похоже, что ViewModel предназначен для использования между действиями и фрагментами, и я не могу получить ViewModel внутри своей службы, чтобы изменить значение, которое должно наблюдаться моим фрагментом. Есть ли способ реализовать это?
Вероятно, вы захотите использовать репозиторий с собственным полем MutableLiveData, которое изменяется в вашей службе. Затем ваша ViewModel будет иметь поле MutableLiveData, указывающее на поле Repository, и ваш фрагмент сможет наблюдать за этим полем.
Фрагмент:
...
viewModel.myData.observe(viewLifecycleOwner) { myData ->
// handle new data observed
}
...
ViewModel:
// Need to clear repo reference in [onCleared] to avoid resource leaks
private var _myData: MutableLiveData<MyData>? = myRepo.myData
val myData: MutableLiveData<MyData> = _myData
...
override fun onCleared() {
super.onCleared()
_myData = null
}
Репозиторий:
val myData = MutableLiveData<MyData>() // or whatever source (Room, etc.)
Услуга:
...
Repository.getInstance().myData.postValue(/* some new info */)
...