本篇继续接着介绍rxjava2.0的其他改变。如果想了解rxjava2.0的观察者模式请看第三篇!

在1.x中,doOnUnsubscribe总是执行终端事件,因为SafeSubscriber调用了unsubscribe。这实际上是没有必要的。Reactive-Streams规范中,一个终端事件到达Subscriber,上游的Subscription会取消,因此调用 cancel()是一个空操作。
由于同样的原因unsubscribeOn也没被在终端路径上调用,但只有实际在链上调用cancel时,才会调用unsubscribeOn。
因此,下面的序列不会被调用
doOnCancel
Flowable.just(1,2,3)
.doOnCancel(new Action() {
@Override
public void run() throws Exception {
Log.e(TAG, " doOnCancel " );
}
})
.subscribe(new DisposableSubscriber<Integer>() {
@Override
public void onNext(Integer integer) {
Log.e(TAG, " onNext : " + integer);
} @Override
public void onError(Throwable t) { } @Override
public void onComplete() {
Log.e(TAG, " onComplete isDisposed() = " + isDisposed()); }
});输出结果如下:
然而,下面将会调用take操作符在传送过程中取消onNext
输出结果如下:
使用take操作符,调用了cancel方法,我们看一下take操作符的源码:
关键点就是这个FlowableTake类,这里限于篇幅的原因就不看源码了,大家可以自己看一下,然后找找是什么地方调用了cancel。
同样的,如果你需要在终端或者取消时执行清理,考虑使用using操作符代替。
结束
RxJava2.0的观察者模式请看下篇。
---我是分割线---
Tamic开发社区
非专业的移动社区
不只是干货,还有人生
长按二维码关注我们