MutableLiveData 总结
1. liveData.observe( ) 方法
-
liveData 对象的
observe(lifecycleOwner, observer)传入一个 lifecycleOwner 和 observer 对象 -
根据 lifecycleOwner 和 observer 对象创建一个 LifecycleBoundObserver 类型的对象 wrapper:
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);, 其中 LifecycleBoundObserver 类继承自 ObserverWrapper -
将 observer 对象和 wrapper 对象放到 mObservers 的 map 集合里 ( key 是 observer 对象, value 是 wrapper 对象 )
-
为 lifecycleOwner 添加观察者即刚才的 wrapper 对象 :
owner.getLifecycle().addObserver(wrapper);
2. liveData 的生命周期感知
- 当 Activity 生命周期变化时就会调用 LifecycleBoundObserver 类型的 wrapper 对象的
onStateChanged()方法, 该方法流程如下 :- 如果当前 Activity 已经 destroy, 那么就调用
removeObserver(mObserver)移除当前 lifecycle 的观察者; - 调用父类 ObserverWrapper 类的
activeStateChanged()方法
- 如果当前 Activity 已经 destroy, 那么就调用
- 而 ObserverWrapper 类的
activeStateChanged()方法会调用 LiveData 类的dispatchingValue()方法, 该方法具体内容见5. liveData.dispatchingValue() 方法
liveData 先发送数据再注册观察者结果也能收到的原因
-
liveData 先发送数据会调用 LiveData 类的
setValue()方法, 并将 value 值保存在 mData 中 -
Activity 生命周期变化时会调用 LifecycleBoundObserver 类型的 wrapper 对象的
onStateChanged()方法, 最终会调用 LiveData 类的dispatchingValue()方法
由于之前使用 LiveData 类的 setValue() 方法保存了 value 值到 mData 中, 所以可以使用 LiveData 类的 dispatchingValue() 方法将 value 值通知给各个 observer
为什么 liveData 生命周期的回调多次但观察者的回调只会执行一次
-
由于生命周期的回调方法会多次执行, 那么
- LifecycleBoundObserver 的
onStateChanged()会多次执行 - ObserverWrapper 类的
activeStateChanged()也会多次执行 - LiveData 类的
dispatchingValue()方法也会多次执行 - LiveData 的
considerNotify(ObserverWrapper)方法也会多次执行
- LifecycleBoundObserver 的
-
LiveData 的
considerNotify(ObserverWrapper)方法会判断 :- 如果
observer.mLastVersion >= mVersion那么也返回, 否则observer.mLastVersion = mVersion;
- 如果
-
但是只有在
liveData.setValue()方法时才会将 LiveData 的 mVersion 加 1, 此时observer.mLastVersion是小于 mVersion 的 -
那么当首次执行 LiveData 的
considerNotify(ObserverWrapper)方法时, 由于observer.mLastVersion < mVersion, 那么就会执行observer.mLastVersion = mVersion;, 再通知各个 observer; 当下次生命周期方法回调再次执行 LiveData 的considerNotify(ObserverWrapper)方法时, 由于observer.mLastVersion == mVersion, LiveData 的considerNotify(ObserverWrapper)方法 就会停止执行, 也就不会通知各个 observer
3. liveData.postValue( ) 方法
LiveData 是一个抽象类, MutableLiveData 是 LiveData 的实现。
-
MutableLiveData 的
postValue()方法最终会调用 LiveData 的postValue()方法 -
LiveData 的
postValue()方法将 value 值临时赋值给 mPendingData, 然后在主线程中执行 mPostValueRunnable, 所以postValue()能够在任意线程中设置值 -
而 mPostValueRunnable 的 run 方法的实现最终调用的是
setValue()方法
4. liveData.setValue( ) 方法
- 首先将 mVersion 版本号加一 :
mVersion++ - 然后将 value 值保存在 mData 中
- 再调用
dispatchingValue()方法
为什么每次回调都是最后一次 setValue( ) 设置的值
liveData.setValue() 方法每次都将 value 值设置给 mData, 即最后一次设置的值会把之前设置的值覆盖掉, 所以每次回调都是最后一次 setValue() 设置的值
5. liveData.dispatchingValue( ) 方法
-
dispatchingValue()方法会遍历 mObservers 中的 observer, 然后调用 LiveData 的considerNotify(ObserverWrapper)方法通知各个观察者 -
considerNotify(ObserverWrapper)方法中会判断 :- 如果界面不可见那么返回
- 如果
observer.mLastVersion >= mVersion那么也返回
然后将 mVersion 重新赋值给
observer.mLastVersion, 再调用observer.onChanged()方法 -
最终会调用 Activity 中的匿名 Observer 类对象的
onChanged()方法。
liveData 在界面不可见时是否会收到消息 ?
不会, liveData 同以前的 EventBus 和 RxBus 不同, liveData 在页面不可见时不会收到消息, 因为在 LiveData 的 considerNotify(ObserverWrapper) 方法会判断, 如果界面不可见那么直接返回, 不会通知各个 observer
6. LiveData 类能否直接使用 ?
LiveData 是一个抽象类, 无法直接使用, 一般使用的是其实现类 MutableLiveData