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.
*/
网友评论