Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建

Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建,第1张

概述我在以下场景中:我有一个包含ViewModel的OnboardActivity,我可以多次旋转这个OnboardActivity,并且ViewModel可以在没有问题的情况下保持配置更改.但是,如果我使用startActivityForResult(...)在此(OnboardActivity)之上启动另一个Activity(FirebaseAuthActi

我在以下场景中:

我有一个包含viewmodel的OnboardActivity,我可以多次旋转这个OnboardActivity,并且viewmodel可以在没有问题的情况下保持配置更改.
但是,如果我使用startActivityForResult(…)在此(OnboardActivity)之上启动另一个Activity(FirebaseAuthActivity),然后在FirebaseAuthActivity中我旋转设备并按后退按钮.当OnboardActivity被带到堆栈顶部时,它会再次重新创建viewmodel实例.

这是viewmodel在架构组件中的正常行为吗?

有没有办法告诉OnboardActivity从堆栈d出时屏幕方向与保存的屏幕方向不同?

最佳答案我已经回答了类似的问题here,这可能会帮助你解决现在的问题.

这是一个来自androID框架的BUG. Bug details

该修复程序在28.0.0-Alpha3和AndroIDX 1.0.0-Alpha3中可用

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

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

大约isFinishing

下面的代码在Kotlin中:

overrIDe fun onDestroy() {  if (!isFinishing) { //isFinishing will be false in case of orIEntation change      val oldviewmodel = obtainviewmodel()      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)}
总结

以上是内存溢出为你收集整理的Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建全部内容,希望文章能够帮你解决Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1139567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存