ViewModel原理剖析

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 get(@NonNull Class 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 get(@NonNull String key, @NonNull Class 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原理剖析)