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