其他分享
首页 > 其他分享> > LiveData工作原理分析

LiveData工作原理分析

作者:互联网

分析paging工作原理前 ,要先了解下LiveData

确保UI符合数据状态

  • 不需要手动处理生命周期
  • 始终保持最新数据
  • 时间总线LiveDataBus

1.LiveData设置的时候遵循的观察者模式,当宿主的生命状态发生改变,LiveData会像里面注册的观察者发出通知,这时候我们可以再观察者的onChange里面更改ui,保持数据
2.LiveData在注册的时候 会绑定生明周期 ,当宿主销毁的时候 LiveData反注册

3.当宿主的生命周期变得非活跃状态的时候,那么它将在再次变成活跃状态时能够接受到最新的数据,比如Activity前台到后台 后台到前台

1.LiveData工作原理

 

第一个构造函数传了一个泛型T

 

如果我们调用形参的LiveData,LiveData的版本 会进行 +1 也就是 -1+1 = 0 

如果调用了 没有参数得构造函数,会把 mData设置成普通的Object

 

当前版本号设置成-1

为什么会有mVersion这个字段?

实际上mVersion是一个同步标志位,因为LiveData在数据分发的时候 会根据Version比对 ,是否进行数据的分发,因为不能因为LiveData分发一次数据 而Observeble 接受到2次3次


下面一个方法是Observe

通过该方法,我们 可以向LiveData注册一个观察者对象,并且LiveData会把当前数组和Observe相关联

它将我们传递的owner和observer包装成LifecycleBoundObserver ,也就是 具有生命周期边界的一个对象

包装完成后 又把得到的对象wrapper添加的了mObservers的HashMap里面去,也就是保存了一个个观察者对象

然后把包装类wrapper 添加到了owner.getLifecycle().addObserver(wrapper); 中

我们跟踪一下addObserver类

首先addObserver是一个抽象方法

在LifecycleRegistry类中实现了addObserver方法

在这里面 首先判断了 当前宿主的生命周期状态

挂载完成之后 将当前的observer 和 生明周期状态 包装成 ObserverWithState

包装完成后也会存储到一个HashMap里面去

为什么要进行包装ObserverWithState呢?

主要是为了方便的分发当前宿主的生命周期状态给每个Observer

图上面就是分发宿主生命周期状态给 每个Observer

  

这里面 mLifecycleObserver就是咱们传递的LifecycleBoundObserver

我们可以看到LifecycleBoundObserver 实现了LifecycleEventObserver

LifecycleEventObserver里面有个非常重要的方法

onStateChanged是指宿主生明周期的变化,里面有两个参数 ,

第一个参数是指我们的宿主 ,第二个参数Lifecycle.Event

 Event是指宿主的生命周期

宿主的每个生命周期的改变 都会回掉到 LifecycleBoundObserver 类中的onStateChanged方法中

这样我们可以看出,宿主的生明周期 发生改变 ,会回调到 LifecycleBoundObserver里面

在onStateChanged方法中判断了 ,如果当前宿主的生命周期状态是销毁状态

则自行反注册Observer

否则的话 调用activeStateChanged方法 回调状态的变更 , 参数是shouldBeActive

 

shouldBeActive方法中 判断了 只有当前宿主的生命周期是大于STARTED这个状态的时候才代表宿主是活跃的

回到 activeStateChanged里面

 

首选判断LiveData里面有没有活跃的观察者对象

当LiveData首次注册一个观察者对象的时候 会执行LiveData的 onActive();方法

当LiveData最后一个观察者被移除的时候 绘执行LiveData的 onInactive()方法

onActive()我们可以再这个方法里面做初始化操作

onInactive()做反注册 清理的工作 (paging就是这么干的)

如果我们传的newActive是true 会走到dispatchingValue方法

这个里面判断了 当前我们传的initiator 是否为空 

不为空 调用considerNotify(initiator);

 

 

在这里面 判断了 如果当前没有活跃的则不分发了 

 判断当前宿主的生明周期 是否 大于STRATED 

如果不大于 将当前observer状态更改为false

 只有当上一个Version小于 当前Version才会继续分发

 将当前版本赋值给历史版本

调用observer的onChanged方法 并将mData传递进去

这个是咱们调用了 LIveData的observer,以及它如何进行数据的分发的


LiveData中 有个和observer相似的方法observeForever()

 

如果我们调用了 observeForever 方法,在宿主销毁的时候 LiveData是不会帮我们进行反注册的,这个时候我们需要自己调用removeObserver,把当前观察者移除掉


 

接下来我们看下postValue

 

如果我们当前环境处在子线程当中,我们必须要用postValue不能使用setValue

 

setValue我们只能用在主线程里面

在 setValue里面我们可以看到mVersion++ , 也就是有一组新的数据加入进来

然后进行分发 ,我们可以看到dispatchingValue(null); 传的是null

首先遍历mObserver hashMap里面的数据 
取出数据调用considerNotify()

 considerNotify和之前分析的一样


 

 

hasObservers是判断当前liveData是否有观察者

 

hasActiveObservers判断LiveData里面是否有活跃的观察者

ps先到这里吧 后续补充 累了

 

 

 

 

 

 

标签:分析,生命周期,宿主,里面,观察者,LiveData,当前,原理
来源: https://blog.csdn.net/nideyida1/article/details/122387745