ViewModel原理深入探究

ViewModel原理深入探究

本文链接:https://blog.csdn.net/feather_wch/article/details/131819092



总结:

  1. ViewModelStoreOwner实现者如Activity、Applciation需要提供ViewModelStore
  2. 谁提供ViewModelStore就要保证其生命周期长度,Activity的逻辑中会通过NonConfigurationInstances恢复非配置实例数据如ViewModel
  3. get时从VIewModelStore中的HashMap获取
  4. 没有拿到就通过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是什么

  1. 用于保留 Activity重新创建时的非配置实例数据的容器类。例如 ViewModelStore
  2. Activity被销毁并重新创建时, getLastNonConfigurationInstance()可以获得之前保存数据的对象并且恢复数据
  3. 保存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

猜你喜欢

转载自blog.csdn.net/feather_wch/article/details/131819092
今日推荐