Java 主题操作员未提供正确答案

Java 主题操作员未提供正确答案,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,你能告诉我为什么下面公布的代码中的总和是14吗??我以为是10点 我正在读一篇关于在Java8中使用rx的教程。但我想确保totsl总和符合预期 请查看以下代码: 代码: Integer subscriber1 = 0; Integer subscriber2 = 0; Observer<Integer> getFirstObserver() { return new Observer<Integer>() { @Override public void

你能告诉我为什么下面公布的代码中的总和是14吗??我以为是10点

我正在读一篇关于在Java8中使用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;
整数下标2=0;
观察员getFirstObserver(){
返回新的观察者(){
@凌驾
public void onNext(整数值){
下标1+=值;
}
@凌驾
公共无效申报人(可丢弃的e){
System.out.println(“错误”);
}
@凌驾
未完成的公共无效(){
System.out.println(“认购人1已完成”);
}
};
}
观察员getSecondObserver(){
返回新的观察者(){
@凌驾
public void onNext(整数值){
下标2+=值;
}
@凌驾
公共无效申报人(可丢弃的e){
System.out.println(“错误”);
}
@凌驾
未完成的公共无效(){
System.out.println(“认购人2已完成”);
}
};
}
PublishSubject=
PublishSubject.create();
subject.subscribe(getFirstObserver());
主题.onNext(1);
主题.onNext(2);
主题.onNext(3);
subject.subscribe(getSecondObserver());
主题.onNext(4);
subject.onCompleted();
assertTrue(subscriber1+subscriber2==14)

让我们一步一步来做吧

当订阅第一个观察者
subject.subscribe(getFirstObserver())时
然后发布
1
2
3
——然后您的
订阅1=6
。然后您将成为第二个观察者
subject.subscribe(getSecondObserver())(但不要取消订阅第一个,这样第一个观察者将接收事件)并发布
4
——之后是
subscriber1=10
subscriber2=4
。因此,您的结果将是
14


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

您是否尝试过使用断点调试代码?是否检查了程序末尾变量的值?为什么预期值为10?第一个用户收到1、2、3和4,第一个用户总共收到10个。第二个订户收到4个,第二个订户总共收到4个。将10和4相加,两个订阅者将得到14。请阅读并相应增强您的问题。请让我知道如何在提供的示例中使用一次性。根据文档,
subscribe
method return
disposable
实例。在调用
publishSubject
disposable.dispose()或
onCompleted()| onError()
之前,您的观察者将处于活动状态。