livedata和viewmodel源码分析

前言
viewmodel以注重生命周期的方式管理界面相关的数据,Livedata在底层数据库更改时通知视图

Livedata和viewModel的基本使用
1.livedata和viewmodel源码分析_第1张图片

新建一个类继承ViewModel,在其中放一个MutableLivedata。

2.livedata和viewmodel源码分析_第2张图片

得到livedata对象,使用setValue方法发送数据

3livedata和viewmodel源码分析_第3张图片

3.实现Observer接口,就可以接收到刚才livedata发送的数据

源码分析

1.我们从 ViewModelProviders.of(getActivity())入手看到ViewModelProviders这个类中的of方法;
livedata和viewmodel源码分析_第4张图片

这个方法主要创建了一个AndroidViewModelFactory和一个ViewModelProvider的对象

2下面我们看一下ViewModelProviders.of(getActivity()).get(NameViewModel.class);
这一句代码主要调用的是 ViewModelProvider类中的get()方法
livedata和viewmodel源码分析_第5张图片
这段代码主要是利用我们传入的key(这个key是根据我们的viewmodel的全类名生成的)去mViewModelStore中获取viewmodel,如果没有获取到就利用工厂的create(这个方法后面分析)方法去创建一个viewmodel 存入到mViewModelStore中
3.我们再看一下 ViewModelStore 这个类
livedata和viewmodel源码分析_第6张图片
这个类其实就是封装了一个HashMap,用来保存我们的viewmodel
4 .上面我们讲到viewmodel 的创建是利用工厂的create()方法,这个工厂是一个接口具体的实现类在ViewModelProvider 中的内部类AndroidViewModelFactory我们看一下它实现的create()方法
livedata和viewmodel源码分析_第7张图片
这个方法主要是利用反射创建出我们的viewmodel对象

5 前面我们说到viewmodel是保存在ViewModelStore 这个对象中的那这个ViewModelStore 对象是什么时候创建的呢?
livedata和viewmodel源码分析_第8张图片
我们在创建ViewModelProvider的时候会传入一个store对象,而这个store可能是新创建的,也可能是在getLastNonConfigurationInstance()这个方法返回的对象中获取的
livedata和viewmodel源码分析_第9张图片
获取的是NonConfigurationInstances这个类中的一个成员变量

livedata和viewmodel源码分析_第10张图片
接下来看一下getLastNonConfigurationInstance()的作用,当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。所以当我们activity意外销毁,或者横竖屏切换的时候这个 viewModelStore对象还在,我们的viewmodel也还在

7 接下来我们看一下livedata 是怎么观察数据变化的,首先我们要实现一个Observer接口,然后调用 livedata的observe()方法,下面我们看一下observe()方法

livedata和viewmodel源码分析_第11张图片
这个方法主要是把我们实现的Observer的类保存到mObservers这个变量中,方便以后的调用

8 当数据发生变化的时候我们调用livedata的 setValue()方法
livedata和viewmodel源码分析_第12张图片
setValue()方法又调用了 dispatchingValue()方法

livedata和viewmodel源码分析_第13张图片
这个方法迭代的集合mObservers就是我们前面保存Observer实现类的那个集合,然后循坏的去执行considerNotify()这个方法。

livedata和viewmodel源码分析_第14张图片
我们在调用setValue()方法的时候会执行mVersion++,这是为了在这里 不满足observer.mLastVersion >= mVersion
这个条件,这样我们就可以执行下面的 observer.mObserver.onChanged((T) mData);这一句代码,从而执行的我们自己实现的onChanged()方法,从而实现了数据变化的监听

livedata和viewmodel的大致流程就是这样的

你可能感兴趣的:(安卓,jetpack)