Rx java RxJava PublishSubject有无观察
我有三个整数观察员,如下所示: 第一观察员:Rx java RxJava PublishSubject有无观察,rx-java,reactivex,rx-java3,Rx Java,Reactivex,Rx Java3,我有三个整数观察员,如下所示: 第一观察员: private Observer<Integer> getFirstObserver() { return new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override pu
private Observer<Integer> getFirstObserver() {
return new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(LOG_TAG, "onNext First " + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
private Observer<Integer> getSecondObserver() {
return new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(LOG_TAG, "onNext Second " + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
private Observer<Integer> getThirdObserver() {
return new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(LOG_TAG, "onNext Third " + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
为什么在这种情况下会出现歧义?请阅读PublishSubject的Javadoc: PublishSubject不保留/缓存项目,因此,新的观察者不会接收任何过去的项目 在第一种情况下,您向同步源订阅了一个
PublishSubject
,因此,在执行到asyncSubject.subscribe(getFirstObserver())之前,所有项目都会完成代码>
在第二种情况下,源现在被调度,当您订阅PublishSubject
时,您将创建一个窗口或竞争(取决于方法执行的位置),以便asyncSubject.subscribe(getFirstObserver())代码>等。有机会及时订阅主题,从而在以后接收项目。据我所知,Android的主线程运行一个事件循环。我的猜测是,您正在循环的一次迭代中构建Rx管道。而且,在后一个示例中,PublishSubject
直到下一个事件循环周期才观察到这些值,此时它已经有了活动订阅服务器。
void asyncSubjectDemo1() {
Observable<Integer> observable = Observable.just(1, 2, 3, 4);
PublishSubject<Integer> asyncSubject = PublishSubject.create();
observable.subscribe(asyncSubject);
asyncSubject.subscribe(getFirstObserver());
asyncSubject.subscribe(getSecondObserver());
asyncSubject.subscribe(getThirdObserver());
}
void asyncSubjectDemo1() {
Observable<Integer> observable = Observable.just(1, 2, 3, 4).observeOn(AndroidSchedulers.mainThread());
PublishSubject<Integer> asyncSubject = PublishSubject.create();
observable.subscribe(asyncSubject);
asyncSubject.subscribe(getFirstObserver());
asyncSubject.subscribe(getSecondObserver());
asyncSubject.subscribe(getThirdObserver());
}
D/MY_LOG: onNext First 1
D/MY_LOG: onNext Second 1
D/MY_LOG: onNext Third 1
D/MY_LOG: onNext First 2
D/MY_LOG: onNext Second 2
D/MY_LOG: onNext Third 2