美文网首页
Android(48)LiveData 解析

Android(48)LiveData 解析

作者: perry_Fan | 来源:发表于2022-08-10 22:20 被阅读0次
  • 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()


相关文章

网友评论

      本文标题:Android(48)LiveData 解析

      本文链接:https://www.haomeiwen.com/subject/neabwrtx.html