LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或 Service 等组件的生命周期。简单来说,他主要有一下优点。
它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI,不用担心发生内存泄漏
当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了。
当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。
消息 消息可以是任何的Object,可以定义不同类型的消息,如 Boolean、String。也可以定义自定义类型的消息。
消息总线 消息总线通过单例实现,不同的消息通道存放在一个 HashMap中。
订阅 订阅者通过 with 获取消息通道,然后调用 observe 订阅这个通道的消息。
发布 发布者通过 with 获取消息通道,然后调用 setValue 或者 postValue 发布消息。
class SingleLiveDataLiveDataBus类: MutableLiveData () { override fun observe(owner: LifecycleOwner, observer: Observer ) { super.observe(owner, observer) hook(observer) } fun observeStick(owner: LifecycleOwner, observer: Observer ){ super.observe(owner, observer) } private fun hook( observer: Observer ) { val liveDataClass = LiveData::class.java val mObserversField = liveDataClass.getDeclaredField("mObservers") mObserversField.isAccessible = true val mObservers = mObserversField.get(this) val observerClass = mObservers::class.java val get = observerClass.getDeclaredMethod("get",Any::class.java) get.isAccessible = true val entry = get.invoke(mObservers, observer) val observerWrapper = (entry as Map.Entry ).value val wrapperClass = observerWrapper.javaClass.superclass val mLastVersion = wrapperClass.getDeclaredField("mLastVersion") mLastVersion.isAccessible = true val mVersion = liveDataClass.getDeclaredField("mVersion") mVersion.isAccessible = true val mVersionValue = mVersion.get(this) mLastVersion.set(observerWrapper,mVersionValue) } }
object LiveDataBus {
private val mBus = hashMapOf>()
fun with(channel: String): SingleLiveData {
if (!mBus.containsKey(channel)) {
mBus[channel] = SingleLiveData()
}
return mBus[channel]!! as SingleLiveData
}
}
使用
//接收消息
LiveDataBus.with<"参数类型">("key").observe(this) {
//it为 发布消息的value
}
//发布消息
LiveDataBus.with<"参数类型">("key").value = mState.mPicList//赋值后observe接收



