Что происходит, когда я отписываюсь от цепочки Observable? - PullRequest
0 голосов
/ 22 декабря 2018

Я использую RxJava в приложении для Android, которое использую.Я хочу знать, что происходит, когда я отписываюсь от цепочки Observable.

Предположим, я имею в виду следующую наблюдаемую цепочку:

sourceObservable
    .map { ... }
    .doOnNext { ... }
    .flatMap { ... }

Я вижу 3 возможных ответа:

  1. Когда я отписываюсь, наблюдаемый источник останавливается, т.е. sourceObservable прекращает испускать элементы.Последний испущенный предмет идет по цепочке до конца.Это вызывает срабатывание каждого оператора.

  2. Когда я отписываюсь, наблюдаемый источник останавливается.Последний испущенный элемент не исчезает, но оператору, через которого он в данный момент проходит (скажем, doOnNext), разрешается завершить.

  3. Когда я отписываюсь, наблюдаемый источник останавливается и нетбольше кода выполняется вообще.Это означает, что, скажем, я использовал doOnNext, код в doOnNext остановится там, где он есть, и не сможет завершиться.

Какой из них (если есть) из нихверно?Зависит ли ответ от того, является ли наблюдаемый источник горячим или холодным?На оператора?

1 Ответ

0 голосов
/ 22 декабря 2018

если элемент испускается, и вы немедленно распоряжаетесь потоком, который хотите остановить, он будет обработан до его завершения, но больше элементов не будет испущено.

, поэтому, если вы посмотрите этот пример, возможно, вы пойметелучше

     observable = Observable.interval(100, TimeUnit.MILLISECONDS)
            .map(aLong -> {
                System.out.println("1");
                return aLong;
            })
            .map(aLong -> {
                observable.dispose();
                System.out.println("2");
                return aLong;
            })
             .map(aLong -> {
                 observable.dispose();
                 System.out.println("3");
                 return aLong;
             })
             .doOnNext(aLong -> System.out.println("4"))
             .map(aLong -> {
                 observable.dispose();
                 System.out.println("5");
                 return aLong;
             })
            .subscribe();
}

В этом потоке будет обработан только первый элемент до конца потока, поэтому даже если первая наша задача - отписаться, мы все равно будем обрабатывать отправленный элемент, поэтому мы отписываемся от источника излучения

...