0

使用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
...
4

1 回答 1

0

文档

如果上游 ObservableSource 和最后一个内部 ObservableSource 都完成,则生成的 ObservableSource 完成

由于上游 ObservableSource是无限流,因此生成的Observable不会完成。

另请注意,根据observable contract, onComplete 表示 observable 已终止,并且将来不会发出任何进一步的项目,因此无论您的实现如何,您都永远不会看到“Completed”后面跟着一些其他项目。

于 2019-05-16T19:31:34.283 回答