主题运算符未提供正确答案

时间:2018-10-11 08:09:07

标签: java rx-java rx-java2

请让我知道为什么下面发布的代码中的总和为14吗?我希望是10

我正在阅读有关在Java 8中使用rx的教程。但是,我想确保totsl的总和符合预期。

请查看以下代码:

代码

Integer subscriber1 = 0;
Integer subscriber2 = 0;
Observer<Integer> getFirstObserver() {
return new Observer<Integer>() {
    @Override
    public void onNext(Integer value) {
       subscriber1 += value;
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("error");
    }

    @Override
    public void onCompleted() {
        System.out.println("Subscriber1 completed");
    }
};
}

Observer<Integer> getSecondObserver() {
 return new Observer<Integer>() {
    @Override
    public void onNext(Integer value) {
        subscriber2 += value;
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("error");
    }

    @Override
    public void onCompleted() {
        System.out.println("Subscriber2 completed");
    }
};
}

PublishSubject<Integer> subject = 
PublishSubject.create(); 
subject.subscribe(getFirstObserver()); 
subject.onNext(1); 
subject.onNext(2); 
subject.onNext(3); 
subject.subscribe(getSecondObserver()); 
subject.onNext(4); 
 subject.onCompleted();

 assertTrue(subscriber1 + subscriber2 == 14)

1 个答案:

答案 0 :(得分:1)

让我们一步一步地做。

订阅第一位观察者subject.subscribe(getFirstObserver());时  并发布123-之后,您的subscriber1 = 6。然后,您订阅第二位观察者subject.subscribe(getSecondObserver());(但不要取消订阅第一位观察者,因此第一位观察者将收到事件)并发布4-在subscriber1 = 10subscriber2 = 4之后。这样您的结果将是14

如果您在订阅新观察者后不想禁用第一个观察者,则应保存Disposable返回的subject.subscribe(getFirstObserver());,并在订购新观察者之前将其处置。