首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >RxJava2.0你不知道的事(二)

RxJava2.0你不知道的事(二)

作者头像
开发者技术前线
发布2020-11-23 11:43:49
发布2020-11-23 11:43:49
4400
举报

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

2.0其他改变

doOnCancel/doOnDispose/unsubscribeOn

在1.x中,doOnUnsubscribe总是执行终端事件,因为SafeSubscriber调用了unsubscribe。这实际上是没有必要的。Reactive-Streams规范中,一个终端事件到达Subscriber,上游的Subscription会取消,因此调用 cancel()是一个空操作。

由于同样的原因unsubscribeOn也没被在终端路径上调用,但只有实际在链上调用cancel时,才会调用unsubscribeOn。

因此,下面的序列不会被调用

doOnCancel

代码语言:javascript
复制
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());           }
       });

输出结果如下:

代码语言:javascript
复制

然而,下面将会调用take操作符在传送过程中取消onNext

代码语言:javascript
复制

输出结果如下:

代码语言:javascript
复制

使用take操作符,调用了cancel方法,我们看一下take操作符的源码:

代码语言:javascript
复制

关键点就是这个FlowableTake类,这里限于篇幅的原因就不看源码了,大家可以自己看一下,然后找找是什么地方调用了cancel。

同样的,如果你需要在终端或者取消时执行清理,考虑使用using操作符代替。

结束

RxJava2.0的观察者模式请看下篇。

---我是分割线---

Tamic开发社区

非专业的移动社区

不只是干货,还有人生

长按二维码关注我们

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发者技术前线 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.0其他改变
    • doOnCancel/doOnDispose/unsubscribeOn
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档