Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java RxJava PublishSubject有无观察_Rx Java_Reactivex_Rx Java3 - Fatal编程技术网

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