ViewModel原理
先下结论
ViewModel的作用,为UI层提供数据,并且能较长时间保存数据直到Activity最终Finished,什么叫最终Finished呢,我的理解是Activity被内存彻底回收。
1.为什么ViewModel可以做到长时间保存数据?
因为ViewModel是Activity的成员变量,理论上只要不主动置为null,它会跟随Activity的存在而一直存在。
2.Activity是怎样储存ViewModel的?
基类ComponentActivity存有一个ViewModelStore对象,ViewModelStore很简单,拥有一个HashMap,专门用来处理所有的ViewModel,它们之间的关系:
Activity -> ViewModelStore -> ViewModel
3.ViewModel的自动回收
当onDestroy()回调的时候,用isChangingConfigurations()用来判断是否为配置变化导致的重启,如果不是,则认为Activity被正常的回收,所有的ViewModel的也随同clear,这也解释了为啥ViewModel能在屏幕旋转后依然能够保存数据。
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();
}
}
}
});