ViewModel
jetpack框架中,viewModel被称为数据中心
它负责管理数据,是MVVM中,连接view与Model的桥梁
而ViewModel的核心价值在于:
- 数据持久化,只有关联的Activity或者Fragment销毁的时候,ViewModel才会销毁
- 多页面共享,可以多个页面使用同一个ViewModel,数据统一
查看关键代码
获取ViewModel
我们一般的使用的时候
viewModel = ViewModelProvider(this)[SampleViewModel::class.java]
看看它做了什么
调用了ViewModelProvider的构造函数,传递了this。
/**
* Creates [ViewModelProvider]. This will create [ViewModel] instances and retain them in the
* [ViewModelStore] of the given [ViewModelStoreOwner].
*
* This method will use the
* [default factory][HasDefaultViewModelProviderFactory.defaultViewModelProviderFactory]
* if the owner implements [HasDefaultViewModelProviderFactory]. Otherwise, a
* [NewInstanceFactory] will be used.
*/
public constructor(
owner: ViewModelStoreOwner,
) : this(
store = owner.viewModelStore,
factory = ViewModelProviders.getDefaultFactory(owner),
defaultCreationExtras = ViewModelProviders.getDefaultCreationExtras(owner)
)
当在FragmentActivity中使用的时候,这个this就是Activity,也是ViewModelStoreOwner。因为它的父类实现了ViewModelStoreOwner接口
activity持有ViewModelStore,而这个ViewModelStore维护了一个viewModel集合
而ViewModelProvider的get方法就会从ViewModelStore维护的ViewModel集合中,根据传递的clazz,获取ViewModel对象。如果集合中有,就取出返回,没有就新建一个实例返回。
生命周期处理
查看ComponentActivity源码,我们知道它的构造函数中,为自己的lifecycle添加了观察LifecycleEventObserver实例对象
这个对象中,观察到如果当前状态是destory的时候,清空它所持有的ViewModelStore
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
// Clear out the available context
mContextAwareHelper.clearAvailableContext();
// And clear the ViewModelStore
if (!isChangingConfigurations()) {
getViewModelStore().clear(); //清空缓存的viewModel集合
}
mReportFullyDrawnExecutor.activityDestroyed();
}
}
});
所以说,只有当Activity彻底销毁的时候,相关的viewModel才会销毁