文档章节

Android 的 ViewModel 机制源码解析

亭子happy
 亭子happy
发布于 01/18 12:16
字数 550
阅读 17
收藏 1

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

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

1. 例子使用:

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

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

2. 源码分析:

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

sDefaultFactory 实例的类:

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

我们再来看 ViewModelStore 的获取:

获取该 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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文转载自:https://www.jianshu.com/p/7cd7edf23761

共有 人打赏支持
亭子happy
粉丝 118
博文 215
码字总数 46492
作品 0
海淀
程序员
私信 提问
Architecture Components MVVM架构演进

在对MVP的架构实践中,发现写单元测试不是那么方便,因为Presenter持有了View的引用,而Mock View的 行为和方法特别的卡慢,因此只能把具体的业务逻辑再抽成一个个独立于Presenter的Logic,进...

Mr云台
2017/11/27
0
0
一点点入坑JetPack:ViewModel篇

前言 费了很多脑细胞,把Lifecycle单拆出来整了一篇文章。那么接下来自然而然的就到了ViewModel,为了让系列像系列的样子,所以这里仍然是单独把ViewModel拿出来。 你别说单独抽出来,还真有...

MDove
02/03
0
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0
MVVM架构篇之databinding源码解析

databinding是google去年发布的一个库,它支持在xml中写表达式使得viewModel中的数据能够绑定到view中,目前已经支持双向绑定,也就是说数据的改变能够反馈到界面上,界面的数据也能够主动传...

何时夕阳
2016/12/17
0
0
架构组件之--ViewModel

前言:这是自己的的第一篇文章,希望可以把自己所学到的东西都能总结并分享出来,希望可以做好。 一、简介 2017Google I/O大会上google引入了lifeCycle组件,说来惭愧,最近才来使用,这也是...

墨迹_T
2018/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Akka实战:HTTP大文件断点上传、下载,秒传

访问:https://github.com/yangbajing/scala-applications/tree/master/file-upload 获取本文所述完整源码,包括Akka HTTP后端和HTML5实现的前端。 在很多应用里面都会有类似大文件上传的需求...

羊八井
33分钟前
2
0
node:event-loop & 宏任务 & 微任务

event-loop(事件轮询) 代码进入执行栈后会判断当前代码是同步任务还是异步任务,如果是同步任务则会将任务调到主线程同步执行,如果是异步任务则会将任务调到异步队列中。 主线程同步任务执...

小草先森
37分钟前
2
0
php-fpm配置文件详解

php-fpm配置文件详解 php-fpm配置文件路径: /usr/local/php-fpm/etc/php-fpm.conf ,还包含了一个配置文件路径下的所有以.conf结尾的配置文件(子配置文件)/usr/local/php-fpm/etc/php-fp...

李超小牛子
59分钟前
4
0
排序-堆排序

在说明堆排序的过程前得先了解什么是堆: 先看下图(来源于java数据结构和算法(第二版)): 堆是个完全二叉树,并且父节点总是大于(小于)它的孩子,因此根节点永远是最大或者最小的元素。...

FAT_mt
今天
3
0
matlab-自控原理 秩判据 能观性 已知线性定常系统的A和C矩阵

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% x'=A*x......

志成就
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部