Почему onComplete не запускается при переключении бесконечного потока - PullRequest
0 голосов
/ 16 мая 2019

Использование RxJava 2.2.8:

Observable.fromCallable(() -> "Some data")
            .subscribe(
                    s -> System.out.println(s),
                    e -> System.err.println(e),
                    () -> System.out.println("Completed")
            );

выход

Some data
Completed

У меня вопрос, почему onComplete никогда не вызывают из-за следующего?

        Observable.interval(1, TimeUnit.SECONDS)
            .switchMap(t -> Observable.fromCallable(() -> "Some data"))
            .subscribe(
                    s -> System.out.println(s),
                    e -> System.err.println(e),
                    () -> System.out.println("Completed")
            );

выход

Some data
Some data
Some data
...

Я понимаю, Observable.interval создаст бесконечный поток, так что onComplete. Мое понимание switchMap состоит в том, что он возвращает наблюдаемую информацию, которая запускает события, произведенные внутренней наблюдаемой (отмена любых ожидающих и выравнивающих), в данном случае Observable.fromCallable.

Теперь эта «внутренняя» наблюдаемая имеет определенный конец (в отличие от внешней наблюдаемой), так почему же onComplete не вызывается для этой внутренней наблюдаемой?

Почему результат не такой?

Some data
Completed
Some data
Completed
Some data
Completed
...

1 Ответ

0 голосов
/ 16 мая 2019

Из документации :

Результирующий ObservableSource завершается, если оба ObservableSource и последний внутренний ObservableSource

Поскольку восходящий ObservableSource является бесконечным потоком, результирующий Observable не будет завершен.

Также обратите внимание, что в соответствии с наблюдаемым контрактом , onComplete указывает, что наблюдаемое прекращено, и оно не будет генерировать какие-либо дополнительные элементы в будущем, поэтому вы никогда не увидите «Завершено», за которым следуют некоторые другие элементы независимо от того, вашей реализации.

...