Java 在doOnSubscribe中调用subject.onNext()

Java 在doOnSubscribe中调用subject.onNext(),java,rx-java2,Java,Rx Java2,为什么在doOnSubscribe内部调用subject.onNext(o)没有任何效果,但是调用subject.onComplete()会导致流终止 final PublishSubject<Integer> subject = PublishSubject.create(); final Observable<Integer> observable = subject.doOnSubscribe(new Consumer<Disposable>(

为什么在
doOnSubscribe
内部调用
subject.onNext(o)
没有任何效果,但是调用
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
    */
final PublishSubject subject=PublishSubject.create();
最终可观测=subject.doOnSubscribe(新消费者(){
@凌驾
public void accept(@NonNull一次性)引发异常{
System.out.println(“一次性=[“+一次性+”]);
主题.onNext(1);
//或
可观察。刚(2,3)。订阅(主题);
}
});
可观察。订阅(新观察者(){
@凌驾
认购的公共无效(一次性d){
System.out.println(“d=[“+d.isDisposed()+”]);
}
@凌驾
public void onNext(整数){
System.out.println(“项=[“+整数+”]);
}
@凌驾
公共无效申报人(可丢弃的e){
System.out.println(“e=[“+e+”]);
}
@凌驾
未完成的公共空间(){
System.out.println(“onComplete”);
}
});/*
预期:
一次性=[假]
d=[假]
项目=1
项目=2
项目=3
未完成
但收到:
一次性=[假]
d=[假]
未完成
*/

在2.x中订阅
主题时,表示连接的
一次性
onNext
看到特定的
观察者之前,正在遍历
onSubscribe()
链。如果从
onSubscribe
调用
hasObservators
,在
onSubscribe
实际返回之前,它将返回false,则可以看到这一点

这是可观察协议所要求的,因为它不允许同时运行
onSubscribe
onNext
,并且
onSubscribe
必须在
onNext
之前发生。如果不遵守此规则,对
Subject.onNext
的并发调用将在
Observer.onSubscribe
调用之前运行,甚至与之同时运行,并找到可能未做好准备的消费者

由于
PublishSubject
不保留任何
onNext
调用,因此将删除未观察到的
onNext
项。根据用例的不同,您应该改为使用
BehaviorSubject
yourSubject.startWith(initialValue).subscribe()
主题
获取任何其他
onNext
之前的值