-2

请您告诉我为什么下面发布的代码中的总和是 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)
4

1 回答 1

1

让我们一步一步来。

当订阅第一个观察者subject.subscribe(getFirstObserver()); 并发布12,, 3- 之后你的subscriber1 = 6. 然后你订阅第二个观察者subject.subscribe(getSecondObserver());(但不要取消订阅第一个,所以第一个观察者会收到事件)并发布4- 之后subscriber1 = 10subscriber2 = 4. 所以你的结果将是14

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

于 2018-10-11T12:04:41.430 回答