JetPack初探之ViewModel
简介
- 官方介绍:
ViewModel is a class that is responsible for preparing and managing the data foran Activity} or a {@link androidx.fragment.app.Fragment Fragment}.
It also handles the communication of the Activity / Fragment with the rest of the application
(e.g. calling the business logic classes). - 直译:
ViewModel是一个负责为Activity或Fragment准备和管理数据的类。它还处理Activity / Fragment与应用程序其余部分的通信
viewModel使用
- 创建MyViewModel()类,让它继承ViewModel()。
- 在Activity/Fragment中使用val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java),获取到viewModel实例。
viewModel可以用来存储与viewModel绑定的view层的数据,如果在使用viewModel期间,将设备旋转(横屏/竖屏),view层会被重新创建,但是viewModel会继续被新创建的view持有。
以上是对viewModel的最基本创建及使用,如果需要更加仔细的则需要在viewModel中配合LiveData或其他Jetpack组件。
源码探究
1.ViewModel()的创建:在MyViewModel()类中Ctrl+右键,进入ViewModel(),在ViewModel类中,官方给了viewModel的简介,使用方法,以及使用viewModel在fragment之间进行数据交互
然后看onCleared()方法,当你的viewModel不再使用时会调用这个方法
2.然后是ViewModelProviders()类中有4个of方法,他们的作用都是:创建一个ViewModelProvider,他能在fragment/Activity给定的生命周期内保存ViewModel。
//这儿只举例fragment
public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
Application application = checkApplication(checkActivity(fragment));
if (factory == null) {
//获取AndroidViewModelFactory
//AndroidViewModelFactory作用:创建AndroidViewModel和ViewModel,
factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
}
//fragment.getViewModelStore():获取view层的viewModelStore
//factory:它将被用来实例化新的viewmodel
return new ViewModelProvider(fragment.getViewModelStore(), factory);
}
其中factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);的作用:创建AndroidViewModel和ViewModel,获取一个有效的AndroidViewModelFactory
点击查看new ViewModelProvider(activity.getViewModelStore(), factory)的ViewModelProvider类中。可以看到在get()方法中
@NonNull
@MainThread
public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
ViewModel viewModel = mViewModelStore.get(key);
if (modelClass.isInstance(viewModel)) {
//noinspection unchecked
return (T) viewModel;
} else {
//noinspection StatementWithEmptyBody
if (viewModel != null) {
// TODO: log a warning.
}
}
if (mFactory instanceof KeyedFactory) {
viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass);
} else {
viewModel = (mFactory).create(modelClass);
}
mViewModelStore.put(key, viewModel);//将viewModel放入ViewModelStore中
//noinspection unchecked
return (T) viewModel;
}
将你的ViewModel存入ViewModelStore中,对应的Key是(DEFAULT_KEY + “:” + canonicalName)
- DEFAULT_KEY = “androidx.lifecycle.ViewModelProvider.DefaultKey”
- canonicalName = modelClass.getCanonicalName();//MyViewModel的文件所在位置如:com.android.test.viewmodel.MyViewModel
3.ViewModelStore:必须通过配置更改来保留{ViewModelStore}的一个实例:如果这个{ViewModelStore}的所有者由于配置更改而被销毁并重新创建,那么所有者的新实例应该仍然拥有相同的{ViewModelStore}的旧实例。
viewModelStore是通过HashMap对ViewModel进行存取操作。
put(String key, ViewModel viewModel)//存储VIewModel
get(String key)//获取已存在的ViewModel
clear() //清除内部存储并通知viewmodel它们不再被使用。
总结
viewModel的基本情况就是这样,它配合LiveData可以对ViewModel中的LiveData数据变化进行观察并随之变化。