Android ViewModel在屏幕旋转时重新创建

tom*_*wyr 6 android android-viewmodel android-architecture-components

我发现了一个不保留架构组件ViewModel的情况 - 简而言之,如下所示:

  1. 活动已启动,并且已创建ViewModel实例
  2. 活动是背景
  3. 设备屏幕旋转
  4. 活动被放回到前台
  5. ViewModel调用ViewModel的方法并创建新对象

在这种情况下,我的ViewModel实例正在被销毁,这是Android的正常行为吗?如果是这样,是否有任何建议的解决方案来保持其状态?
我可以想到的一种方法ViewModel是在调用时保存它,但是,只要活动实际完成,它也会保持状态.另一种方法可能是利用onCleared它,但它在每个屏幕旋转时触发(不仅如果应用程序在后台).
处理这种情况的银弹?

Sur*_*ath 7

是的@tomwyr,这是一个来自android框架的bug.错误细节

该修复程序在28.0.0-alpha3和AndroidX 1.0.0-alpha3中可用

但是,如果您现在不想更新到上面的版本,那么您可以这样解决(我知道这是一个糟糕的解决方案,但我没有看到任何其他好方法)

在您的活动中重写onDestroy方法在调用super.onDestroy之前将所有必需字段保存到局部变量.现在调用super.onDestroy,然后再次初始化ViewModel,并将所需的字段分配回ViewModel的新实例

关于isFinishing

下面的代码在Kotlin中:

override fun onDestroy() {
     val oldViewModel = obtainViewModel()

     if (!isFinishing) { //isFinishing will be false in case of orientation change

          val requiredFieldValue = oldViewModel.getRequiredFieldValue()

          super.onDestroy

         val newViewModel = obtainViewModel()

         if (newViewModel != oldViewModel) { //View Model has been destroyed
              newViewModel.setRequiredFieldValue(requiredFieldValue)
          }
      } else {
         super.onDestroy
      }
 }

private fun obtainViewModel(): SampleViewModel {
      return ViewModelProviders.of(this).get(SampleViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)