Android(48)LiveData 解析
-
LiveData 组件是Jetpack 推出的 基于观察者的消息订阅 / 分发组件,具有宿主(Activity、Fragment)生命周期感知能力,这种感知能力可确保 LiveData 仅分发消息给出于活跃状态(Observer所在宿主出于 started、resumed状态)的观察者,即只有处于活动状态的观察者才能收到消息。
-
LiveData的消息分发机制,是以往的 Handler、EventBus、RxJavaBus 无法比拟的,它们不会顾及当前页面是否可见,一股脑地有消息就转发。导致即便应用在后台,页面不可见,还在进行无用的绘制、计算(比如微信消息列表就是在可见状态时才会更新列表最新消息的)
这是以往常用的Handler 发送消息的模板代码。
以下是常见 liveData的使用情况。
LiveData的集中衍生类:
MutableLiveData:
我们在使用LiveData 做消息分发时,需要使用这个子类。之所以如此设计,是考虑到单一开闭原则,只有拿到了 MutableLiveData 对象才可以发送消息,LiveData 对象只能接收消息,避免拿到了 LiveData 对象时既能发送消息也能接受消息的混乱使用。
MediatorLiveData:
它可以统一观察多个 LiveData 的发射的数据进行统一的处理;同时也可以作为一个 LiveData,被其他 Observer 观察。
Transformations.map 操作符
它可以对 LiveData 进行变化,并返回一个新的 LiveData 对象
LiveData 核心方法
LiveData 实现原理
粘性消息分发流程
普通消息分发流程
源码分析
LiveData.LifecycleBoundObserver.onStateChanged():
为什么我们在使用LiveData时不需要关注宿主的生命状态呢?就在这里可以看到,因为当宿主生命周期发生变化时都会回调到此。
其中,在接下来会调用它:
LiveData还可以实现宿主生命周期消失还能接受消息的可能,如何实现呢?
LiveData.ObserverWrapper.activeStateChanged()
接下来分析一下宿主状态发生变化的进一步处理逻辑:
可以覆写方法做一些事件:
同样的,如果是不活跃状态也会进行回调处理:
最后进行值的分发:
LiveData.dispatchingValue():
有新的数据了,会遍历所有的观察者进行数据的分发。
LiveData.considerNotify()
接下来产生粘性事件的根本原因的代码逻辑来了:
LiveData.postValue()
LiveData.setValue()