分析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先到这里吧 后续补充 累了