RxBus 1

作者: ivotai | 来源:发表于2020-03-29 09:20 被阅读0次

    代码

    object RxBus {
    
        private val subject: Subject<Any> = PublishSubject.create<Any>().toSerialized()
    
        fun post(any: Any) {
            subject.onNext(any)
        }
    
        fun <T> registerEvent(clazz: Class<T>, consumer: Consumer<T>) {
            subject.ofType(clazz).subscribe(consumer)
        }
    
    }
    

    使用

    class SecondActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_second)
            
            RxBus.registerEvent(String::class.java, Consumer {
                textView.text = it
            })
    
            textView.setOnClickListener {
                RxBus.post("hello world")
            }
        }
    
    }
    

    原理分析

      subject.ofType(clazz).subscribe(consumer)
    

    ofType 源码:

        public final <U> Observable<U> ofType(final Class<U> clazz) {
            ObjectHelper.requireNonNull(clazz, "clazz is null");
            return filter(Functions.isInstanceOf(clazz)).cast(clazz);
        }
    

    根据 简单操作符链式调用的实质
    S.F.C -> A 等价于,
    S -> F(C(A)),F 代表 FilterObserver。
    S -> F 代表,把 F 加入 subject 的通知集合。
    根据 Subject,每当

        fun post(any: Any) {
            subject.onNext(any)
        }
    

    一个 any 就会被发射给 F(C(A)),F 执行过滤,调用 C.onNext,
    C 执行类型转换,最终调用 A.accept。

    相关文章

      网友评论

          本文标题:RxBus 1

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