为什么在切换无限流时未触发onComplete

时间:2019-05-16 18:57:08

标签: reactive-programming rx-java2 switchmap

使用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,它触发由内部Observable产生的事件(取消所有暂挂和展平),在这种情况下为Observable.fromCallable

现在,这个“内部”可观察对象确实有一个确定的终点(与外部可观察对象不同),那么为什么onComplete不会在此内部可观察对象上被调用?

为什么输出不是这样?

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

1 个答案:

答案 0 :(得分:0)

来自documentation

  

如果两个上游都完成了结果ObservableSource   ObservableSource和最后一个内部ObservableSource

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

还要注意,根据observable contract,onComplete表示可观察对象已终止,并且将来将不再发射任何其他项,因此无论您采用何种实现方式,您都不会看到“已完成”和其他一些项