美文网首页
ViewModel原理剖析

ViewModel原理剖析

作者: 默默奋斗的木头人 | 来源:发表于2020-09-15 14:54 被阅读0次
    image.png

    1.首先通过ViewModelProviders获取ViewModel实例:

    HomeViewModel viewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
    

    上面的代码调用到如下的of方法:

        @NonNull
        @MainThread
        public static ViewModelProvider of(@NonNull FragmentActivity activity,
                @Nullable Factory factory) {
            //检查fragment或activity是否已经成功创建,也就是不能在onCreate之前调用ViewModel
            Application application = checkApplication(activity);
            if (factory == null) {
                //AndroidViewModelFactory是ViewModelProvider的静态内部类,唯一的作用就是根据create方法,创建ViewModel实例
                factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
            }
            return new ViewModelProvider(activity.getViewModelStore(), factory);
        }
    

    AndroidViewModelFactory中最主要的两个方法:
    (也可以自己来创建ViewModel,KeyedFactory是一个抽象类,可以进行扩展)

    //创建ViewModel类实例
    modelClass.getConstructor(Application.class).newInstance(mApplication);
    modelClass.newInstance();
    

    ViewModelStore实际上是一个HashMap,顾名思义,就是用来存储ViewModel的。其实际上也只有put, get, clear, keys四个方法,最后一个是获取所有的key。

    public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
            mFactory = factory;
            mViewModelStore = store;
        }
    
    public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
            String canonicalName = modelClass.getCanonicalName();
            if (canonicalName == null) {
                throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
            }
            return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
        }
    
    public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
            //从ViewModelStore中获取ViewModel
            ViewModel viewModel = mViewModelStore.get(key);
    
            //判断viewModel是否是ModelClass的子类,如果是直接返回
            if (modelClass.isInstance(viewModel)) {
                //noinspection unchecked
                return (T) viewModel;
            } else {
                //noinspection StatementWithEmptyBody
                if (viewModel != null) {
                    // TODO: log a warning.
                }
            }
            //如果ViewModelStore中没有保存过ViewModel,那么通过factory来创建ViewModel实例,并且保存到ViewModelStore中。
            if (mFactory instanceof KeyedFactory) {
                viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass);
            } else {
                viewModel = (mFactory).create(modelClass);
            }
            mViewModelStore.put(key, viewModel);
            //noinspection unchecked
            return (T) viewModel;
        }
    

    get方法就是先在ViewModelStore中查找是否已经创建过ViewModel,如果已经存在了那么直接返回该ViewModel,这一步也解释了为什么在多个fragment中可以共享activity中的数据(key值都是根据DEFAULT_KEY + ":" + modelClass.getCanonicalName(),也就是只要你自己创建的ViewModel在同一个activity中,肯定只有一个实例)

    1. ViewModel
      ViewModel本身是一个抽象类,本身并不复杂。

    2. 最主要的是ViewModel在Activity和Fragment中是怎样管理生命周期的,为什么就算activity配置改变后,重新走了onCreate方法,ViewModel还是存在的?
      涉及activity的启动流程...,后面再看...

    相关文章

      网友评论

          本文标题:ViewModel原理剖析

          本文链接:https://www.haomeiwen.com/subject/tiixyktx.html