LiveData相关的类图

LiveData涉及的类相对少一些,没这么复杂,要进行LiveData的源码阅读,还是先阅读下LifeCycle的源码,因为里面涉及了LifeCycle的东西,LiveData,只有在LifeCycle的状态是STARTED或者是RESUMED才会去分发value,为什么呢?从字面也好理解,LiveData嘛,活着的数据,嘻嘻嘻,Live,Live,Live。但是,也有例外,observerForever(observer:Observer<? super T>)这个方法添加的Observer就是无论LifeCycle是什么状态的,这个Observer都是可以收到setValue改变之后的data,这个为什么,后面会说到。
LiveData的Observe(LifecycleOwner,Observer observer)方法

LiveData是一个抽象类,但是看源码并没有什么抽象的方法,但是有几个空的方法,分别是onActive(),和onInactive(),这两个方法是什么作用的,这里留个疑问。先写Observe方法吧
1.先断言当前这个方法的调用是不是主线程,如果不是主线程会抛出异常
所以这里可以得出一个结论,Observe不能在子线程中调用。这里的断言,涉及到ArchTaskExecutor的源码书写,这里我就省略这一部分的介绍,有兴趣的同学可以去看看默认的Executor,也就是DefaultTaskExecutor,里面有一个只有两条线程的IO线程池和一个主线程的Handler,这个TaskExecutor可以给一些借鉴的意义去写异步的任务的管理。
2. 判断当前的LifeCycle的状态,如果是Destory直接就return了。
3. 新建一个LifecycleBoundObserver对象
LifecycleBoundObserver这个内部类继承了ObserverWrapper这个类,同时实现了GenericLifecycleObserver这个接口,所以这个类的职责就是监听生命周期的切换并记录当前的状态,同时在只有状态大于或者等于STARTED的时候才去分发value,这里的代码是shouldBeActive这个方法做的判断。当LifecycleOwner的生命周期变成DESTORY时就会移除Observer,这个对象的构造方法涉及到了两个对象,一个是LifecycleOwner,和,observer,第一个对象主要是为了随时获取当前生命周期的状态,第二个对象就是问了分发value,
4.add进集合中保存,同时这里也做了判断,也就是说同一个ObserverWrapper不能添加到不同的lifecycle中,这个在上一篇生命周期LifeCycle的源码中有说。
5.把LifecycleBoundObserver依附到LifeCycleOwner中,开始监听生命周期的切换。
setValue(T value) ,postValue(T value)和 dispatchingValue(ObserverWrapper initiator)
setValue(T value)赋值新的Value给mData同时,mVersion+1,然后调用dispatchingValue(null),分发value,这里dispatchingValue如果传的参数不为空的话,就是只分发当前这个参数的value值,如果为空,就会遍历map集合中保存的Observer,并分发value,postValue()这个方法一般都是在子线程调用的。
considerNotity(observer)
这个方法是在dispatchingValue方法中调用,主要的作用就是确认下Observer当前的状态,是不是大于或者等于STARTED,如果是才会去分发。
onActive()和onInactive()
这两个方法是在哪里调用的呢?答案是ObserverWraper抽象类的activeStateChange(boolean active)这个方法调用,而activeStateChange这个方法会在生命周期回调的时候调用,和当setValue的时候触发considerNotity方法并且当前的生命周期状态不是大等于STARTED的时候调用,当生命周期的状态大等于STARTED的时候会调用onActive(),并且会分发value()如果生命周期的状态小于STARTED就会调用onInactive()
总结就是,在LifeCycle的状态大等于STARTE的时候,会调用OnActive(),小于STARTED就会调用OnInactive()
总结
LiveData总的来说就是监控生命周期的状态并且在生命周期的状态大于或者等于STARTED的时候分发相关的value, 在DESTORY的时候会主动移除Observer,当然也有不管在什么状态下都可以分发Value的Observer,就是AlwaysActiveObserver,这个方法shoudBeActive永远返回true,不关心lifecycle的生命周期和状态。
最后
还是那句,写得不好,如果哪里写得不对的话,希望指正下我这个迷途的小书童。