美文网首页
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