为什么在subject.onNext(o)
内调用doOnSubscribe
无效,但调用subject.onComplete()
会导致流终止!
final PublishSubject<Integer> subject = PublishSubject.create();
final Observable<Integer> observable = subject.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull Disposable disposable) throws Exception {
System.out.println("disposable = [" + disposable + "]");
subject.onNext(1);
//or
Observable.just(2, 3).subscribe(subject);
}
});
observable.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("d = [" + d.isDisposed() + "]");
}
@Override
public void onNext(Integer integer) {
System.out.println("item = [" + integer + "]");
}
@Override
public void onError(Throwable e) {
System.out.println("e = [" + e + "]");
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
});/*
expected:
disposable = [false]
d = [false]
item = 1
item = 2
item = 3
onComplete
but received :
disposable = [false]
d = [false]
onComplete
*/
答案 0 :(得分:2)
订阅2.x中的Subject
时,代表该连接的Disposable
正在遍历onSubscribe()
链,然后Observer
变为onNext
可见}}。如果您从hasObservers
致电onSubscribe
,您会看到这一点,它会返回false,直到onSubscribe
实际返回。
这是Observable协议所要求的,因为不允许同时运行onSubscribe
和onNext
,而onSubscribe
必须在onNext
之前运行。如果此规则未被保留,则Subject.onNext
的并发呼叫将在Observer.onSubscribe
呼叫之前或甚至同时运行,并找到可能没有准备的消费者。
由于PublishSubject
未保留任何onNext
次调用,因此会删除未观察到的onNext
项。根据使用情况,您应该使用BehaviorSubject
或yourSubject.startWith(initialValue).subscribe()
来获取onNext
中任何其他Subject
之前的值。