Java 当我从一个可观察的连锁店退订时会发生什么?

Java 当我从一个可观察的连锁店退订时会发生什么?,java,rx-java2,Java,Rx Java2,我正在使用的Android应用程序中使用RxJava。我想知道当我从一个可观察的链中取消订阅时会发生什么 假设我指的是以下可观察链: sourceObservable .map { ... } .doOnNext { ... } .flatMap { ... } 我看到3个可能的答案: 当我取消订阅时,sourceObservable停止,即sourceObservable停止发送项目。最后一个发出的项沿着链向下移动,直到结束。它会导致每个操作员开火 当我取消订阅时,可

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

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

sourceObservable
    .map { ... }
    .doOnNext { ... }
    .flatMap { ... }
我看到3个可能的答案:

  • 当我取消订阅时,sourceObservable停止,即sourceObservable停止发送项目。最后一个发出的项沿着链向下移动,直到结束。它会导致每个操作员开火

  • 当我取消订阅时,可观察的源停止。最后发出的项目不会下降,但允许它当前正在通过的操作员(例如
    doOnNext
    )完成

  • 当我取消订阅时,源代码停止,不再执行任何代码。这意味着,如果我正在使用
    doOnNext
    ,则
    doOnNext
    中的代码将停止,并且不允许完成


  • 哪一个(如果有的话)是正确的?答案是否取决于可观测到的源是热的还是冷的?在操作员上?

    如果发出一个项目,并且您立即处理该流,则该项目要停止,它将被处理直到完成处理,但不会发出更多的项目

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

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

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

    感谢您的回复。但根据这一讨论,flatMap的行为不同:。我很困惑。@是的,在flatmap的情况下,您插入了另一个流,因此如果您在flatmap之前已处理,flatmap中的流将不会被订阅,因此流将在flatmap@NightMare如果您不清楚,flatmap是另一个在每个emit中订阅的流。明白了。谢谢:)