返回
** Jetpack全家桶(第三篇):ViewModel源码剖析
Android
2023-10-31 08:09:54
**文章
正文:
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在其中扮演的重要角色。