【问题标题】:What happens when I unsubscribe from an Observable chain?当我取消订阅 Observable 链时会发生什么?
【发布时间】:2018-12-22 07:02:12
【问题描述】:

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

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

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

我看到了 3 个可能的答案:

  1. 当我取消订阅时,源 observable 停止,即 sourceObservable 停止发射项目。最后一个发出的项目沿着链向下直到它结束。它会导致每个操作员触发。

  2. 当我取消订阅时,源 observable 停止。最后发出的项目不会关闭,但它当前正在经历的操作员(比如doOnNext)被允许完成。

  3. 当我取消订阅时,源 observable 停止并且根本不再执行任何代码。这意味着假设我正在使用doOnNextdoOnNext 中的代码将停止在它所在的位置并且不允许完成。

其中哪一个(如果有的话)是正确的?答案是否取决于源 observable 是热的还是冷的?关于运营商?

【问题讨论】:

    标签: java rx-java2


    【解决方案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();
    }
    

    在这个流中,只有第一个项目会被处理到流的末尾,所以即使我们做的第一个工作是取消订阅,我们仍然会处理发射的项目,所以我们从发射源取消订阅

    【讨论】:

    • 感谢您的回复。但是根据这个讨论,flatMap 的行为不同:link。我很困惑。
    • @NightMare 是的,如果是平面地图,你会插入另一个流,所以如果你在平面地图之前处理了平面地图中的流,那么平面地图​​中的流将不会被订阅,所以流将在平面地图之前停止
    • @NightMare 如果您不清楚平面图是在每次发射中订阅的另一个流。
    • 知道了。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 2020-08-29
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多