java - 当我取消订阅 Observable 链时会发生什么?

标签 java rx-java2

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

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

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

我看到 3 个可能的答案:

  1. 当我取消订阅时,源可观察对象将停止,即源可观察对象停止发出项目。最后发出的项目沿着链向下直到结束。它会导致每个运算符(operator)被解雇。

  2. 当我取消订阅时,源可观察对象停止。最后发出的项不会下降,但它当前正在执行的操作符(例如 doOnNext)被允许完成。

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

哪一个(如果有的话)是正确的?答案是否取决于可观测源是热源还是冷源?在运营商上?

最佳答案

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

所以如果你看这个例子也许你会更好地理解

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

在此流中,只有第一个项目会被处理,直到流结束,因此即使我们所做的第一项工作是取消订阅,我们仍然会处理发出的项目,因此我们从发射源取消订阅

关于java - 当我取消订阅 Observable 链时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53893720/

相关文章:

java - 如何实现BehaviorSubject + retrofit api调用

java - 从用户处获取密码值,我想在 url 路径中使用此密码,我使用 thymeleaf 作为模板引擎

android - RxJava - 如何停止(和恢复)Hot Observable(间隔)?

java - 从数据库列检索所有数据

java - MySQL 中的字段由 LOAD DATA INFILE 终止

java - 谓词过滤器 rxjava2 - 如何传递动态过滤器参数

java - RxJava : Thread pool for network calls

java - 链式 API 调用中的 RxJava 错误处理

java - 防止对象类创建

java - 在Java中使用for循环时如何实现return语句?