取消订阅可观察链时会发生什么?

时间:2018-12-22 07:02:13

标签: java rx-java2

我正在使用的Android应用程序中使用RxJava。我想知道取消订阅Observable链后会发生什么。

假设我指的是以下可观察的链:

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

我看到3个可能的答案:

  1. 当我退订时,可观察的源停止,即sourceObservable停止发射项目。发出的最后一个项目沿着链条下降直到结束。这会导致每个操作员被解雇。

  2. 当我退订时,可观察到的源停止。最后发出的项不会下降,但允许其当前正在通过的运算符(例如doOnNext)完成。

  3. 当我退订时,可观察到的源停止并且根本不再执行任何代码。这意味着说我正在使用doOnNextdoOnNext中的代码将停止在原处,并且不允许完成。

其中哪个(如果有)是正确的?答案取决于可观察到的源是热还是冷?在操作员上?

1 个答案:

答案 0 :(得分:1)

如果发出一个项目,并且您立即处置该流,则要停止的项目将一直处理到完成处理,但不再发出任何项目。

因此,如果您观看此示例,也许您会更好地了解

     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();
}

在此流中,仅第一项将被处理到流结束,因此,即使我们要做的第一项工作是取消订阅,我们仍将处理已发出的项,因此我们将取消订阅的来源