ViewModel 简单整理

74 阅读2分钟

ViewModel 简单整理

1.在Activity.onCreate方法中创建了ViewModelStore.同时在创建ViewModel时如果按照下方式;

//一般的绑定方式
private val viewModel by lazy { ViewModelProvider(this)[MainViewModel::class.java] }
//通过viewmodels绑定方式,适用于activtiy和fragment
private val viewModel by viewModels<MainViewModel>()
//适用于在fragment页面绑定activity的viewmodel,实现页面内fragment 共享回调
private val viewmodel activityViewModels<MainViewModel>()
//适用于在View中想要绑定viewmodel的方式。Context 一样要来自于activity或者fragment。
private val viewModel: MainViewModel by lazy {
    ViewModelProvider(findViewTreeViewModelStoreOwner())[MainViewModel::class.java]
}

会直接实现ViewModelStore和Viewmodel的绑定,其实就是将ViewModel存储在ViewmodelStore的map集合中进行缓存。

2.如果在Activity.oncreate方法中 已经有缓存的配置数据。(也就是在页面配置信息发生改变时进行的缓存(一般是屏幕翻转)。会将数据信息缓存在ActivityClientRecord 静态类中。)就会获取到缓存信息,然后进行数据的恢复工作。将ViewmodelStore进行重新获取,并恢复。由于ViewmodelStore 内部的map 集合持有Viewmodel,因此Viewmodel也就顺利的被恢复了。

3.同时在Activity.create方法中同时创建了FragmentManagerViewModel : ViewModel() 对象。并将该viewmodel缓存在了activity.viewmodelStore的map集合中。 同时FragmentManagerViewmodel中持有一个map 集合。该集合缓存了ViewmodelStore的对象,key是fragment.mWho;同时将fragmentmanagerviewmodel 缓存在fragmentStore中。而FragmentStore 属于fragment的信息缓存类;

4.如果在Activity.onCreate方法中存在配置信息。就会直接恢复缓存数据信息 ;

5.在performResume中会将缓存的配置信息进行制空,避免出现再次加载activity时出现账数据。

6.在页面销毁时 performDestroyActivity方法中进行数据的保存操作。前提是属于页面配置信息发生改变,会保存Activity.ViewmodelStore,以及FragmentManagerNonConfig

等信息,在该配置中会记录fragment的子fragment的viewmodelstore集合信息。

7、如果数据页面销毁那么就会调用ViewmodelStore.clear方法进行页面的清空操作。同时在Viewmodel中调用onCleared方法。该方法也会触发viewmodel内部协程的销毁,前提是内部协程在viewmodelScope作用域中。

8.注意,如果ViewModel是通过new Viewmodel()创建,并没有添加到ViewModelStore中,那么在配置信息发生改变时,也不会进行恢复。

9.viewmodel 执行销毁流程

10.viewmodel恢复流程图

viewmodel.png