Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 保存活动';使用onSaveInstanceState()和ViewModel设置s状态_Android_Android Activity_Persistence_Android Viewmodel_Android Mvvm - Fatal编程技术网

Android 保存活动';使用onSaveInstanceState()和ViewModel设置s状态

Android 保存活动';使用onSaveInstanceState()和ViewModel设置s状态,android,android-activity,persistence,android-viewmodel,android-mvvm,Android,Android Activity,Persistence,Android Viewmodel,Android Mvvm,阅读本文后,我对ViewModels有一些疑问: 这里说,您应该结合使用ViewModel进行配置更改(如屏幕旋转),并在所有其他情况下使用onSaveInstanceState(),其中活动被销毁,然后重新创建,以保存UI状态 我的问题是,当调用onCreate(Bundle)时,我们如何知道恢复状态的方法?我应该使用ViewModel还是使用收到的Bundle作为参数?当配置更改时,还会调用onSaveInstanceState(),显然总是调用onCreate() 如果我只从ViewMo

阅读本文后,我对ViewModels有一些疑问:

这里说,您应该结合使用
ViewModel
进行配置更改(如屏幕旋转),并在所有其他情况下使用
onSaveInstanceState()
,其中活动被销毁,然后重新创建,以保存UI状态

我的问题是,当调用
onCreate(Bundle)
时,我们如何知道恢复状态的方法?我应该使用ViewModel还是使用收到的Bundle作为参数?当配置更改时,还会调用
onSaveInstanceState()
,显然总是调用
onCreate()


如果我只从ViewModel恢复状态,它不会始终保留正确的数据(因为活动可能由于配置更改以外的其他原因而被销毁)。如果我只使用保存在
onSaveInstanceState()
中的捆绑包,那么我为什么要首先使用
ViewModel

我认为最好将这些源代码看作一个链。 您有两个数据源—ViewModel,速度更快但寿命更短;保存的实例状态速度较慢但寿命更长

规则很简单-请尝试使用ViewModel,如果未填充,请使用onSaveInstanceState()中的捆绑包

在onCreate()中执行
val model=ViewModelProviders.of(this).get(MyViewModel::class.java)
。然后,如果它是一个新实例(即,它的数据字段为空),您可以从包中获取一些基本数据,如内容id,并根据该id从后端或数据库获取数据,用它填充新的ViewModel,然后从ViewModel填充活动(如果您使用LiveData,这将非常自然)

下次调用onCreate时,请重复此过程,从ViewModel填充活动,或者使用捆绑包中的数据填充ViewModel,然后从ViewModel填充活动

更新:
事实上,官方报告中描述了非常类似的方法。唯一的区别是,您将捆绑包传递给ViewModel,它决定是否需要获取数据,我没有具体说明此机制。

例如,如果ViewModel中的所有数据都只是初始化为默认值的原语,该怎么办?我无法判断这是因为该实例是一个新实例,还是因为这些值都是正确的。。总之,总的来说,你的建议听起来像是一个解决办法。在这种情况下,你需要实现一些字段来指示你的ViewModel不是新创建的,或者向你的状态包中添加一些数据并使用它。如果您只需要保存一堆原语,那么使用ViewModel不会有太多好处,在本例中,只需实现实例状态并使用它即可。ViewModel可以帮助您保留复杂的下载数据或用户生成的数据。此外,还可以检查答案更新,它链接到官方方法。因此,据我所知,它还说您应该检查所需的数据是否已经存在。。是否有某种系统标志告诉您在onCreate中的原因?或者一个标志告诉您ViewModel是否刚刚创建?我认为当您第一次使用ViewModelProviders创建ViewModel时,框架不会调用ViewModel上的任何参数构造函数,因此您可以使用它作为ViewModel是新的指示器。