Subject

作者: ivotai | 来源:发表于2020-03-27 14:19 被阅读0次
Observable.just(1).subscribe { println(it) }    // 1

普通的 Observable 订阅时就会发射。

而 Subject 不同,看看订阅时它干了什么,以 PublishSubject 为例。

    protected void subscribeActual(Observer<? super T> t) {
        PublishDisposable<T> ps = new PublishDisposable<T>(t, this);
        t.onSubscribe(ps);
        if (add(ps)) {
        ...
    }

内部维护了一个 PublishDisposable 数组,把订阅的 Observer 保存在里面。

再来看 onNext 方法:

    public void onNext(T t) {
        for (PublishDisposable<T> s : subscribers.get()) {
            s.onNext(t);
        }
    }

PublishDisposable 的 onNext 方法:

        public void onNext(T t) {
            if (!get()) {
                actual.onNext(t);
            }
        }

对 Subject 而言,订阅是将响应端添加到集合中,onNext 是群体发射。

        val subject = PublishSubject.create<Any>()
        // 把 observer 添加到集合中
        subject.subscribe { Logger.d("observer1") }
        subject.subscribe { Logger.d("observer2") }
        // subject 作为 Observer
        Observable.just(1).subscribe(subject)
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ Thread: main
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ LambdaObserver.onNext  (LambdaObserver.java:63)
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │    MainActivity$onCreate$1.accept  (MainActivity.kt:34)
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ Observer1
2020-03-28 10:29:14.998 11281-11281/com.example.myapplication D/PRETTY_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ Thread: main
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ LambdaObserver.onNext  (LambdaObserver.java:63)
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │    MainActivity$onCreate$2.accept  (MainActivity.kt:35)
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: │ Observer2
2020-03-28 10:29:14.999 11281-11281/com.example.myapplication D/PRETTY_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────

最后用源码注释来总结 Subject 的特性:

/**
 * Represents an {@link Observer} and an {@link Observable} at the same time, allowing
 * multicasting events from a single source to multiple child {@code Observer}s.
 */

相关文章

  • RxJava2.0----Subject&Observe

    Subject/Observer Subject/Observer模式,Subject翻译为主题 , Subjec...

  • RAC flattenMap

    flattenMap: RACSubject * subject = [RACSubject subject]; ...

  • shiro介绍

    Subject主体,代表了当前“用户,所有Subject都绑定到SecurityManager,与Subject的...

  • Subject

    subject即是被观察者也是观察者。 Subject类型 PublishSubject 没有初始值,要先订阅,才...

  • Subject

    PublishSubject 是Observable的子类 var publishSubject = Publis...

  • Subject

    1.Subject可以看成是一个桥梁或者代理,在RxJava中,它同时充当了Observer和Observable...

  • No subject

    They say that goods things happens to good people, today ...

  • 《subject》

    我要尝试再多一些的办法 变聪明 变迟钝 变近 变远 变得看得见 变得摸不着 把夏宇变成我 把我变成卞之琳 我要尝试...

  • Subject

    普通的 Observable 订阅时就会发射。 而 Subject 不同,看看订阅时它干了什么,以 Publish...

  • subject

    subject 不会输出 subcribe 前面的数据;behaviorSubject 会 输出 subcrib...

网友评论

      本文标题:Subject

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