Android ViewModel 的好处是会随 Activity 销毁调用它的 clear() 方法。ide
咱们分析一下它是怎么作到的。函数
1. 例子使用:源码分析
a、 建立类 TestMvvmViewModel 继承 ViewModel,重写 onCleared() ,把清空的操做放在里面;this
b、 在 actvity 或者 fragment 中使用 ViewModelProviders.of(this).get(TestMvvmViewModel.class) 获取 TestMvvmViewModel 的实例;继承
2. 源码分析:生命周期
初始化 sDefaultFactory ,获取 ViewModelStore ,用 sDefaultFactory 和 ViewModelStore 建立 ViewModelProvider 实例。get
sDefaultFactory 实例的类:源码
建立 ViewModel 的实例的时候,先判断是不是 AndroidViewModel 的字类,若是是就建立带 Applictaion 的 ViewModel, 若是不是就走父类的建立函数,建立无参构造函数的 ViewModel 类。it
咱们再来看 ViewModelStore 的获取:io
获取该 activity 绑定的 HolderFragment 的 ViewModelStore,HolderFragment 是动态添加进去 activity 的:
在 HolderFragment 的 onDestroy() 调用了 mViewModelStore.clear(),遍历调用了它的 ViewModel map 里面的全部 ViewModel 的clear():
这时,咱们先理一下:
首先,ViewModelStore 是 HolderFragment 类的成员,而且在HolderFragment的 onDestroy() 调用了 clear(),遍历调用了它的 ViewModel map 里面的全部 ViewModel 的clear();
其次,HolderFragment 添加到了 Activity 或者 Fragment 中,因此 HolderFragment 的 onDestroy() 跟着 Activity 或者 Fragment 生命周期 onDestroy() (是HolderFragment 的 onDestroy() 先回调),
因此,当 Activity 要被销毁的时候,ViewModel 会调用它的 clear() 方法。
接下来,看看是何时把 ViewModel 放进 ViewModelStore 的 ViewModel map 里面的:
ViewModelProvider 的 get(Class modelClass) :
建立了 ViewModel 实例,并立刻添加进 ViewModelStore 的 ViewModel map 里面。
总结一下, ViewModel 随 Activity 销毁调用它的 clear() 方法, 是借助了 Fragment 和 Activity 生命周期绑定的机制。
补充:
1. 横竖屏切换时,Activity 销毁重建,可是由于 ViewModel 依赖的 HolderFragment 设置了 setRetainInstance(true),因此在横竖屏切换的时候 HolderFragment 的 onDestroy() 没有走,因此 ViewModel 的 onCleared() 也不会调用。
做者:keanbin 连接:https://www.jianshu.com/p/7cd7edf23761 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。