Тематический оператор не дает правильных ответов - PullRequest
0 голосов
/ 11 октября 2018

Пожалуйста, дайте мне знать, почему общее суммирование в приведенном ниже коде составляет 14 ??Я ожидал, что это будет 10

Я читал учебник по использованию rx в Java 8. Но я хочу убедиться, что суммирование 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 голосов
/ 11 октября 2018

Давайте сделаем это шаг за шагом.

При подписке первый наблюдатель subject.subscribe(getFirstObserver()); и сообщение 1, 2, 3 - после этого ваш subscriber1 = 6.Затем вы подписываете второго наблюдателя subject.subscribe(getSecondObserver()); (но не отписываетесь от первого, поэтому первый наблюдатель будет получать события) и публикуете 4 - после этого subscriber1 = 10 и subscriber2 = 4.Таким образом, ваш результат будет 14.

Если вы не хотите отключать своего первого наблюдателя после подписки нового, вам следует сохранить Disposable, возвращенный subject.subscribe(getFirstObserver());, и утилизировать его перед подпиской нового наблюдателя.

...