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中,肯定只有一个实例)
-
ViewModel
ViewModel本身是一个抽象类,本身并不复杂。 -
最主要的是ViewModel在Activity和Fragment中是怎样管理生命周期的,为什么就算activity配置改变后,重新走了onCreate方法,ViewModel还是存在的?
涉及activity的启动流程...,后面再看...
网友评论