ViewModel原理深入探究
本文链接:https://blog.csdn.net/feather_wch/article/details/131819092
文章目录
总结:
- ViewModelStoreOwner实现者如Activity、Applciation需要提供ViewModelStore
- 谁提供ViewModelStore就要保证其生命周期长度,Activity的逻辑中会通过NonConfigurationInstances恢复非配置实例数据如ViewModel
- get时从VIewModelStore中的HashMap获取
- 没有拿到就通过Factory构造,AndroidViewModelFactory作用就是调用参数包含application的构造器
示例
ViewModel作用:保证数据的稳定性,可以避免用户填写了很多EditText数据接个电话数据没了
val userViewModel = ViewModelProvider(this, AndroidViewModelFactory(application))
.get(UserViewModel::class.java)
userViewModel.userInfo.value = "wch"
ViewModelProvider构造
ViewModelProvider构造: 存储ViewModelStoreOwner和Factory
ViewModelProvider(ViewModelStoreOwner owner, factory)
->this(owner.getViewModelStore(), factory)
-->mFactory = factory;
-->mViewModelStore = store;
ViewModelStoreOwner
1、Activity等Owner需要实现getViewModelStore()
public interface ViewModelStoreOwner {
ViewModelStore getViewModelStore();
}
->getViewModelStore() {
-->if (mViewModelStore == null) {
--->nc =(NonConfigurationInstances) getLastNonConfigurationInstance();
--->mViewModelStore = nc.viewModelStore; // 恢复之前的数据
or
--->mViewModelStore = new ViewModelStore(); // 不存在就新建
-->return mViewModelStore;
NonConfigurationInstances
1、NonConfigurationInstances是什么
- 用于保留
Activity
重新创建时的非配置实例数据的容器类。例如ViewModelStore
Activity
被销毁并重新创建时,getLastNonConfigurationInstance()
可以获得之前保存数据的对象并且恢复数据- 保存ViewModel时ComponentActivity提供的功能
ComponentActivity#onRetainNonConfigurationInstance()
->保存ViewModel
2、NonConfigurationInstances是如何做到横竖屏切换还能保存数据的?
->handleRelauncheActivity()
-->handleDestoryActivity()
--->retainNonConfigurationInstances()
---->onRetainNonConfigurationInstance() // 保存ViewModelStore
-->handleLauncherActivity()
--->attach() // 传入并且恢复数据
Factory: 反射传入参数调用ViewModel构造方法
public T create(@NonNull Class modelClass) {
if (AndroidViewModel.class.isAssignableFrom(modelClass)) {
return modelClass.getConstructor(Application.class).newInstance(mApplication);
}
return super.create(modelClass);
}
get()
get(Class modelClass)// modelClass = UserViewModel.class
->canonicalName = modelClass.getCanonicalName();
->get(DEFAULT_KEY + ":" + canonicalName, modelClass);
-->viewModel = mViewModelStore.get(key); // 从ViewModelStore中获取指定key的ViewModel实例
-->viewModel = (mFactory).create(modelClass); // 不存在用工厂构建
---【AndroidViewModelFactor】# // modelClass必须继承自AndroidViewModel,有接收application的构造方法
--->modelClass.getConstructor(Application.class).newInstance(mApplication);
---【NewInstanceFactory】
--->modelClass.newInstance();
-->mViewModelStore.put(key, viewModel);
-->return viewModel;
ViewModelStore中是HashMap