tom*_*wyr 6 android android-viewmodel android-architecture-components
我发现了一个不保留架构组件ViewModel的情况 - 简而言之,如下所示:
ViewModel调用ViewModel的方法并创建新对象在这种情况下,我的ViewModel实例正在被销毁,这是Android的正常行为吗?如果是这样,是否有任何建议的解决方案来保持其状态?
我可以想到的一种方法ViewModel是在调用时保存它,但是,只要活动实际完成,它也会保持状态.另一种方法可能是利用onCleared它,但它在每个屏幕旋转时触发(不仅如果应用程序在后台).
处理这种情况的银弹?
是的@tomwyr,这是一个来自android框架的bug.错误细节
该修复程序在28.0.0-alpha3和AndroidX 1.0.0-alpha3中可用
但是,如果您现在不想更新到上面的版本,那么您可以这样解决(我知道这是一个糟糕的解决方案,但我没有看到任何其他好方法)
在您的活动中重写onDestroy方法并在调用super.onDestroy之前将所有必需字段保存到局部变量.现在调用super.onDestroy,然后再次初始化ViewModel,并将所需的字段分配回ViewModel的新实例
下面的代码在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)
| 归档时间: |
|
| 查看次数: |
5308 次 |
| 最近记录: |