接着上篇文章继续:
1 LiveData流程图
Lifecycle改变触发流程:
结论:LifecycleOwner生命周期改变,只会通知绑定该Owner的Observer。
setValue/postValue触发流程:
结论:setValue会通知所有激活状态的Observer。
2 Stick Event
LiveData被订阅时,如果之前已经更改过数据,并且当前owner为active的状态,activeStateChanged()会被调用,也即会立马通知到Observer,这样其实就类似EventBus的sticky event的功能,但很多时候我们其实并不需要这功能。
3 AlwaysActiveObserver
默认情况下,LiveData会跟LicycleOwn绑定,只在active状态下更新,如若想要不管在任何状态下都能收到数据的更改通知的话,这时候就需要使用AlwaysActiveObserver,改调用observe方法为LiveData.observeForever(Observer)方法即可。
4 MediatorLiveData
它是LiveData的一个子类,它允许我们合并多个LiveData,任何一个LiveData有更新就会发生通知。比如我们的数据来源有两个,一个数据库一个网络,这时候我们就会有两个DataSource,也就是两个LiveData,这个时候我们可以使用它来merge这两个LiveData。
5 Transformations
它允许我们把一个LiveData进行处理,变成另外一个LiveData,目前支持map和switchMap两个方法,
Transformations.map(mLiveData!!) { input: String? ->
Integer.valueOf(input)
}.observe(this) { integer: Int? ->
Log.i(TAG, "onChangedMap: " + integer)
}
6 LiveDataBus
下篇讲述
总结:
LiveData的实现是基于观察者模式。
LiveData跟LifecycleOwner绑定,能感知生命周期变化,并且只会在LifecycleOwner处于Active状态下通知数据改变,如果数据改变发生在非Active状态,数据会变化,但是不发送通知,等owner回到active的状态下,再发送通知;
如果想要一直收到通知,则需要用observeForever()方法
LiveData会自动在DESTORYED的状态下移除Observer,取消订阅,所以不用担心内存泄漏。
postValue方法其实最后调用了setValue只不过把操作放在主线程,适合在异步线程里调用,setValue必须在主线程里调用。
如果同时多次调用postValue或setValue修改数据,只会修改成最新的那个数据,也即只会收到一次通知(set/post混合调用则不一定)
如果LiveData有数据,并且owner在active状态下,那么在订阅的时候,会立马收到一次通知。
一个Observer实例,只能绑定一个LifecycleOwner,而一个owner可以绑定多个Observer实例。
LiveData利用版本管理,绑定Lifecycle确保了只会发送最新的数据给active状态下的Observer。
LiveData基于观察者模式,并且可以感知生命周期,这让我们使用LiveData既可以享受观察者模式带来的隔离数据与UI等强大的解耦能力,还可以享受感知生命周期带来的巨大便利。并且还无需担心内存泄漏问题。