一些废话
纸上得来终觉浅,却知此事要躬行。
如果你想知道事情的本质,那就去一步一步去探索,很久以前觉得看几篇别人写的博客,就可以知道其中的奥妙了,慢慢的觉得这种想法太天真了,讲句实在话,我是照着源码去重写了一遍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的源码解析。