LiveDataBus事件分发----加强版

前言

看这篇文章之前,大家可以先看一下上一篇文章LiveDatasBus事件分发,以及另外一篇Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus,我觉得他写的很不错,拿了RxBus.EventBus.LiveDataBus做对比,然后分析。我看了他的文章之后深受启发,记得我在写LiveDatasBus事件分发这篇文章时,结尾是希望能够结合RxJava,既加上了生命周期的处理,又结合了RxJava灵活的链式写法,又可以自由的切换线程,感觉还是比较好用的。

源码
object LiveDataBus {
    private var liveMap = HashMap, MutableLiveData<*>>()
    private val bus = PublishSubject.create().toSerialized()

    fun post(value: Any) {
        if (liveMap.containsKey(value::class.java)) {
            (liveMap[value::class.java] as MutableLiveData).postValue(value)
        }
    }

    fun  toObservable(owner: LifecycleOwner, cls: Class): Observable {
        if (!liveMap.containsKey(cls as Class)) {
            var liveData = MutableLiveData()
            liveMap[cls] = liveData
        }
        liveMap[cls]?.let { liveData ->
            liveData.observe(owner, object : Observer {
                override fun onChanged(t: Any) {
                    bus.onNext(t)
                }
            })
        }
        return bus.ofType(cls) as Observable
    }
}
使用方法

注册

 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。

你可能感兴趣的:(LiveDataBus事件分发----加强版)