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
之前的值