Как исправить: Room DAO LiveData перестает излучать по всему приложению после быстрого фонового и затем возобновления приложения - PullRequest
3 голосов
/ 03 июля 2019

У меня есть несколько моделей 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) })
}

...