我正在使用的Android应用程序中使用RxJava。我想知道取消订阅Observable
链后会发生什么。
假设我指的是以下可观察的链:
sourceObservable
.map { ... }
.doOnNext { ... }
.flatMap { ... }
我看到3个可能的答案:
当我退订时,可观察的源停止,即sourceObservable停止发射项目。发出的最后一个项目沿着链条下降直到结束。这会导致每个操作员被解雇。
当我退订时,可观察到的源停止。最后发出的项不会下降,但允许其当前正在通过的运算符(例如doOnNext
)完成。
当我退订时,可观察到的源停止并且根本不再执行任何代码。这意味着说我正在使用doOnNext
,doOnNext
中的代码将停止在原处,并且不允许完成。
其中哪个(如果有)是正确的?答案取决于可观察到的源是热还是冷?在操作员上?
答案 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();
}
在此流中,仅第一项将被处理到流结束,因此,即使我们要做的第一项工作是取消订阅,我们仍将处理已发出的项,因此我们将取消订阅的来源