美文网首页
LiveDataBus事件分发----加强版

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

作者: javalong | 来源:发表于2020-01-02 16:26 被阅读0次
    前言

    看这篇文章之前,大家可以先看一下上一篇文章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。

    相关文章

      网友评论

          本文标题:LiveDataBus事件分发----加强版

          本文链接:https://www.haomeiwen.com/subject/kanzoctx.html