手撕Android Jetpack LifeCycle ,LiveData和ViewModel -LifeCycle篇

915 阅读5分钟

一些废话

纸上得来终觉浅,却知此事要躬行。

如果你想知道事情的本质,那就去一步一步去探索,很久以前觉得看几篇别人写的博客,就可以知道其中的奥妙了,慢慢的觉得这种想法太天真了,讲句实在话,我是照着源码去重写了一遍lifecycle,LiveData,ViewModel,然后写一个简单的MVVM,别想着说看几篇博客就知道原理,反正我不行,从学生时代开始,我就不是那种过目不忘的厉害的学生,我只能用最笨的方法,虽然笨,但是乐此不疲。

我给自己提的一些疑问

1.事件是怎么分发到Observer的?

2.可以在子线程AddObserver吗?

3.LifeCycle的两个枚举事件和状态分别有哪些,如果当前状态是RUSMED,事件是onREsume,当ON_PAUSE执行的时候,LiveCycle的状态是什么。

4.如果在Activity的OnResume中AddObserver,这个Observer可以接到OnCreate和OnStart事件吗?

5.LiveData的onActive和OnInactive的区别是?

6.怎么进行ViewModel之前的通信?

7.怎么在多个页面使用同一个ViewModel?

8.LiveData中同一个Observer可以添加到不同的LifeCycleOwner吗?

9.ViewModel怎么做到适配横竖屏切换这种数据的恢复的?

能看懂都散了吧。

每个模块涉及到的各个类

有一些类类名不一样是为了避免和androidx里的冲突,比如MyViewModel


LifeCycle工作原理

这一部分我只撕了activity的生命周期的分发,Fragment我简单的看了一下,道理都是一样的。

官方定义的状态和事件图


这个是官方给的LifeCycle组件定义的状态和事件的枚举,在LifeCycle这个接口中定义了这两种枚举,有5种状态和6种事件,图中描述了这些状态和事件之间的关系。

手撕LifeCycle生成的类图



Activity中LifeCycle分发生命周期的功臣-ReportFragment.

从源码中看,这部分的代码在ComponentActivity中的ReportFragment,在OnCreate的时候调用了上图类图中的injectInNeededIn(Activity activity),该方法就是往Activity中attached一个Fragment,这样Activity的生命周期发生变化的时候,就可以触发事件的分发和状态的变更。

拿出其中的一个事件来分析,当Activity调用生命周期OnPause时,会触发ReportFragment的OnPause,这时调用dispatch(Lifecycle.Event event)


通过Activity的getLifecycle获取到LifecycleRegistry,然后调用handleLifecycleEvent(event).

LifecycleRegistry的神秘面纱

这个类是关键,接着上面分析的,我们来看看这个类的handleLifecycleEvent做了什么。

1.先获取这个事件发生后的状态应该是什么

   State next = getStateAfter(event),如果这次事件是OnCreate,对照上面官方的状态图,那么State就是CREATE,如果这次事件是onResume那么状态就是要变成RESUMED了。


2.moveToState(State next),设置LifecycleRegister当前的状态为next。

3.sync()

   同步相关的事件和状态给已经注册的Observer,当当前的状态State比map(这个map保存了通过AddObserver添加的Observer)中的最早也就是头部元素的枚举State状态要小,那么就是遍历这个map中的所有的Observer,分发事件并同步Observer的状态到和当前状态一致。源码就是backWardPass(lifecycleOwner)


当当前状态比map中的end的元素的状态大时,比如当前状态是RESUMED,map中的Observer的状态是STARTED,这时就要遍历map中,往前同步状态,顾名思义就是forwardPass


4.mObserverMap,LifecycleObserver,ObserverWithState,addObserver,removeObserver

     mObserverMap,怎么理解上面的遍历map同步Observer的状态呢,这个map指的就是LifecycleRegisty中的成员变量FastSafeIterableMap<LifecycleObserver,ObserverWithState> mObserverMap = new FastSafeIterableMap<>(),FastSafeIterableMap这个map是fastsafe的,也就是支持在遍历的时候增加和删除,同时也是一个双向链表。

    addObserver,往Map中添加Observer,第一步就是先构造一个ObserverWithState,里面包含了LifecycleObserver,和state,每次分发也就是上面的sync的方法,其实就是调用ObserverWithState的dispatchEvent方法,重新改变State的值并分发事件给响应的观察者,observer

解答自己对LifeCycle的一些疑问

到这一步Lifecycle的原理也就基本分析完成了,

1.事件是怎么分发到Observer的?

    如果是Activity的话,就会是从ReportFragment的生命周期开始。Fragment的话,其实就是直接从生命周期的回调中,触发LifeCycleRegistry的handleLifecycleEvent,然后计算出当前事件对应的State,然后遍历Map中的Observer,同步State和分发事件。这里面有更细节的东西,如果当前的State比map(本质是个双向链表)中eldest()的元素要小,那么就要backwardPass(RESUMED->STARTED->CREATED->INITIALIZED->DESTROYED),相反如果比newest()的元素的state要大就要forwardPass(DESTROYED->INITIALIZED->CREATED->STARTED->RESUMED)

2.可以在子线程AddObserver吗? --答案是可以的,看源码有一些标志位,其实就是预防在子线程中添加Observer的

3. LifeCycle的枚举事件和枚举状态分别有哪些,如果当前状态是RUSMED,事件是ON_RESUMED,当ON_PAUSE执行的时候,LiveCycle的状态是什么。

枚举的事件:ON_CREATE,ON_START,ON_RESUMED,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY.

枚举状态:DESTROYED,INITIALIZED,CREATED,STARTED,RESUMED.

LIfeCycle的状态是:STARTED。

4.如果在Activity的OnResume中AddObserver,这个Observer可以接到OnCreate和OnStart事件吗?可以的。当Observer被Add的时候,最初的状态是INITIALIZED,这时会被同步到RESUMED的状态,会传递事件ON_CREATE,和ONSTART

最后

各位大佬,有幸看到小弟这篇文章,如果哪里写错了,欢迎指正,后面会更新LiveData和ViewModel的源码解析。