В документации ViewModel
Однако объекты ViewModel никогда не должны наблюдать изменения наблюдаемых объектов с учетом жизненного цикла, таких как объекты LiveData.
Другой способ - реализовать RxJava вместо LiveData для данных, тогда у них не будет преимуществ, связанных с жизненным циклом.
В примере Google todo-mvvm-live-kotlin используется обратный вызов без LiveData в ViewModel.
Я предполагаю, что если вы хотите полностью соответствовать идее того, чтобы быть продуктом жизненного цикла, нам нужно переместить код наблюдения в Activity / Fragment. В противном случае мы можем использовать обратный вызов или RxJava в ViewModel.
Другой компромисс - реализовать MediatorLiveData (или Transformations) и наблюдать (разместить здесь свою логику) в ViewModel. Обратите внимание, что наблюдатель MediatorLiveData не сработает (как и преобразования), если он не будет обнаружен в Activity / Fragment. Что мы делаем, так это помещаем пустое наблюдение в Activity / Fragment, где реальная работа фактически выполняется в ViewModel.
fun start(id : Long) : LiveData<User>? {
val liveData = MediatorLiveData<User>()
liveData.addSource(dataSource.getById(id), Observer {
if (it != null) {
}
})
}
viewModel.start(id)?.observe(this, Observer {
})
PS: Я прочитал ViewModels и LiveData: Patterns + AntiPatterns, в которых говорилось, что Transformations. Я не думаю, что это сработает, если не соблюдаются LiveData (что, вероятно, требует, чтобы это было сделано в Activity / Fragment).