返回

** Jetpack全家桶(第三篇):ViewModel源码剖析

Android

**文章
正文:

ViewModel的创建

让我们从ViewModelProvider的构造函数开始分析:

public ViewModelProvider(ViewModelStoreOwner owner, Factory factory) {
    mViewModelStore = owner.getViewModelStore();
    if (mViewModelStore == null) {
        throw new IllegalStateException("No ViewModelStore available for " + owner);
    }
    mFactory = factory;
}

ViewModelProvider在创建时需要传入一个ViewModelStoreOwner和一个Factory。ViewModelStoreOwner代表ViewModel的拥有者,而Factory则用于创建ViewModel。

Factory的getFactory方法

Factory是一个接口,它定义了一个getFactory方法:

@Nullable
public abstract <T extends ViewModel> T create(@NonNull Class<T> modelClass);

这个方法返回一个指定类型的ViewModel实例。

ViewModel的创建过程

在ViewModelProvider的get方法中,会调用Factory的getFactory方法来创建ViewModel:

@NonNull
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 create(canonicalName);
}

这里需要注意的是,get方法返回的ViewModel是一个新的实例,而不是从ViewModelStore中获取的。

ViewModel的恢复

在ViewModelProvider的create方法中,会尝试从ViewModelStore中恢复ViewModel:

@Nullable
private <T extends ViewModel> T create(@NonNull String canonicalName) {
    T vm = mViewModelStore.get(canonicalName);
    if (vm == null) {
        vm = createViewModel(canonicalName);
        mViewModelStore.put(canonicalName, vm);
    }
    return vm;
}

如果ViewModelStore中不存在ViewModel,则会调用createViewModel方法创建新的ViewModel。createViewModel方法调用Factory的getFactory方法来创建ViewModel。

通过对ViewModel源码的分析,我们可以了解ViewModel的创建和恢复过程,以及Factory在其中扮演的重要角色。