У меня есть несколько моделей ViewModel, которые создают наблюдателей на объектах LiveData, созданных с помощью комнатных DAO.Эти ViewModels объединяют различные выбросы LiveData в окончательные ViewState LiveDatas, которые наблюдаются их соответствующими фрагментами.Обычно они работают без проблем, но есть случай, когда почти все LiveData, подключенные к Room, неожиданно ломаются.
Если я открою свое приложение, быстро коснусь «Назад» из приложения, а затем быстро возобновлю приложение, есть вероятность 5-10% того, что большинство цепочек LiveData, которые каким-либо образом взаимодействуют с Room, останутся в тупике., как будто цепочка LiveData не наблюдается.Это происходит везде в приложении, даже с фрагментами, которые я не посещал в текущем сеансе до того, как проявилось патологическое поведение.
После погружения в код, после достижения состояния ошибки, оно выглядит как Callableбыть переданным трекеру недействительности Комнаты никогда не вызывается.В качестве эксперимента я создал наблюдающий форевер в profileStream, чтобы проверить, могу ли я использовать другой путь кода.Это привело к выполнению Callable, но он возвращает устаревшие данные.В любом случае ObserveForever является неподходящим решением, и я не хотел дополнительно отлаживать эту опцию.
Подозрительно относясь к проблемам, связанным с жизненным циклом, я поменял «this» на моих вызовах наблюдений для viewLifecycleOwners фрагментов.Похоже, это ничего не изменило.
viewModel.viewState.observe(viewLifecycleOwner, Observer { render(it) })
VIEWMODEL
init {
val profileStream = profileRepo.getProfile(id)
viewState.addSource(mapPhotoStream()) { photos -> viewState.value =
currentViewState().copy(photos = photos) }
viewState.addSource(profileStream) { profile ->
if (profile.name == null) {
Log.w(TAG, "Name of a profile should not be null.
UserId=${profile.userId}")
}
viewState.value = currentViewState().copy(
name = profile.name ?: ""
)
}
}
FRAGMENT
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setupBottomSheetBehavior()
viewModel.viewState.observe(viewLifecycleOwner, Observer { render(it) })
}