请让我知道为什么下面发布的代码中的总和为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)
答案 0 :(得分:1)
让我们一步一步地做。
订阅第一位观察者subject.subscribe(getFirstObserver());
时
并发布1
,2
,3
-之后,您的subscriber1 = 6
。然后,您订阅第二位观察者subject.subscribe(getSecondObserver());
(但不要取消订阅第一位观察者,因此第一位观察者将收到事件)并发布4
-在subscriber1 = 10
和subscriber2 = 4
之后。这样您的结果将是14
。
如果您在订阅新观察者后不想禁用第一个观察者,则应保存Disposable
返回的subject.subscribe(getFirstObserver());
,并在订购新观察者之前将其处置。