前言
看这篇文章之前,大家可以先看一下上一篇文章LiveDatasBus事件分发,以及另外一篇Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus,我觉得他写的很不错,拿了RxBus.EventBus.LiveDataBus做对比,然后分析。我看了他的文章之后深受启发,记得我在写LiveDatasBus事件分发这篇文章时,结尾是希望能够结合RxJava,既加上了生命周期的处理,又结合了RxJava灵活的链式写法,又可以自由的切换线程,感觉还是比较好用的。
源码
object LiveDataBus {
private var liveMap = HashMap<Class<Any>, MutableLiveData<*>>()
private val bus = PublishSubject.create<Any>().toSerialized()
fun post(value: Any) {
if (liveMap.containsKey(value::class.java)) {
(liveMap[value::class.java] as MutableLiveData<Any>).postValue(value)
}
}
fun <T> toObservable(owner: LifecycleOwner, cls: Class<T>): Observable<T> {
if (!liveMap.containsKey(cls as Class<Any>)) {
var liveData = MutableLiveData<Any>()
liveMap[cls] = liveData
}
liveMap[cls]?.let { liveData ->
liveData.observe(owner, object : Observer<Any> {
override fun onChanged(t: Any) {
bus.onNext(t)
}
})
}
return bus.ofType(cls) as Observable<T>
}
}
使用方法
注册
LiveDataBus.toObservable(this, EventData::class.java)
.subscribe {
Toast.makeText(MainActivity@ this, "接收到事件 ${it.value}", Toast.LENGTH_LONG).show()
}
发送
LiveDataBus.post(EventData("test1", "aa"))
总结
使用起来确实非常的方便,其中关键的地方就是结合RxBus,使用PubulisSubject及SerializedSubject。