Android记录--viewModel

70 阅读1分钟

ViewModel

jetpack框架中,viewModel被称为数据中心

它负责管理数据,是MVVM中,连接view与Model的桥梁

而ViewModel的核心价值在于:

  1. 数据持久化,只有关联的Activity或者Fragment销毁的时候,ViewModel才会销毁
  2. 多页面共享,可以多个页面使用同一个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才会销毁