android view源码解析,Android 的 ViewModel 机制源码解析

Android ViewModel 的好处是会随 Activity 销毁调用它的 clear() 方法。

我们分析一下它是怎么做到的。

1. 例子使用:

a、 创建类 TestMvvmViewModel 继承 ViewModel,重写 onCleared() ,把清空的操作放在里面;

b、 在 actvity 或者 fragment 中使用 ViewModelProviders.of(this).get(TestMvvmViewModel.class) 获取 TestMvvmViewModel 的实例;

2. 源码分析:

7cd7edf23761

初始化 sDefaultFactory ,获取 ViewModelStore ,用 sDefaultFactory 和 ViewModelStore 创建 ViewModelProvider 实例。

sDefaultFactory 实例的类:

7cd7edf23761

创建 ViewModel 的实例的时候,先判断是否是 AndroidViewModel 的字类,如果是就创建带 Applictaion 的 ViewModel, 如果不是就走父类的创建函数,创建无参构造函数的 ViewModel 类。

我们再来看 ViewModelStore 的获取:

7cd7edf23761

获取该 activity 绑定的 HolderFragment 的 ViewModelStore,HolderFragment 是动态添加进去 activity 的:

7cd7edf23761

7cd7edf23761

7cd7edf23761

7cd7edf23761

在 HolderFragment 的 onDestroy() 调用了 mViewModelStore.clear(),遍历调用了它的 ViewModel map 里面的所有 ViewModel 的clear():

7cd7edf23761

7cd7edf23761

这时,我们先理一下:

首先,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) :

7cd7edf23761

7cd7edf23761

7cd7edf23761

创建了 ViewModel 实例,并马上添加进 ViewModelStore 的 ViewModel map 里面。

总结一下, ViewModel 随 Activity 销毁调用它的 clear() 方法, 是借助了 Fragment 和 Activity 生命周期绑定的机制。

补充:

1. 横竖屏切换时,Activity 销毁重建,但是因为 ViewModel 依赖的 HolderFragment 设置了 setRetainInstance(true),所以在横竖屏切换的时候 HolderFragment 的 onDestroy() 没有走,所以 ViewModel 的 onCleared() 也不会调用。

7cd7edf23761

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值