RxJava——基础学习(九),辅助操作符

学习资料:

1. 辅助操作符

1.1 delay延迟

延迟发送接收到的每一个数据项,暂时一段时间再发送。最终,所有的数据项,整体向后延迟指定的时间段

1.1.1 delay(long,TimeUnit,Schedulers)

指定延迟的时间,单位

默认在computation调度器上执行

简单使用:

    /**
     * 指定延迟时间 ,单位 , 调度线程
     */
    private static void delayCount() {
        Observable
                .just(1,2,3)
                .delay(3, TimeUnit.SECONDS, Schedulers.immediate())
                .subscribe(System.out::println);
    }

延迟3秒发送数据项,后一项依次延时3秒,当发送过3时,并不会立刻结束,也会延迟3秒后才结束

注意:delay不会延迟onError()通知,会立即将错误信号发送给订阅者,并将所有呆发射的onNext()通知全部丢弃。但delay会延迟onCompleted()通知


1.1.2 delay(Func1)

delay(Func1)

Func1函数中返回一个新的Observable,这个新的Observable被当作原始Observable的延时定时器。当新的Observable被返回时,就会发射与之相关联的数据项

默认不在任何特定的线程执行,在默认线程

简单使用

/**
 * Func1中的Observable当作延时定时器
 */
private static void delayFunc1() {
        Observable
                .just(1, 2, 3)
                .delay(new Func1<Integer, Observable<Long>>() {
                    @Override
                    public Observable<Long> call(Integer integer) {
                        return Observable
                                .timer(1,TimeUnit.SECONDS,Schedulers.immediate());
//                                .flatMap(new Func1<Long, Observable<Integer>>() {
//                                    @Override
//                                    public Observable<Integer> call(Long aLong) {
//                                        return Observable.just(integer + 10);//函数结果不会作用于原始数据项
//                                    }
//                                });
                    }
                })
                .subscribe(System.out::println);
    }

由于新的Observable只是当作一个定时器,在新的Observable中,再使用函数对原始数据项进行修改,无效


1.2 Do占位符

注册一个动作,作为原始Observable的生命周期

1.2.1 doOnNext(Action1)

注册一个回调,产生的Observable每发送出一个数据项,当触发onNext()时就会回调一次

可以考虑使用这个关键字来对网络请求结果进行缓存处理

doOnEach(Action1)则会在触发onNext(),onError(),onCompleted()时都进行回调

简单使用

    /**
     * 当产生的随机数大于 0.8 时 ,抛出异常
     */
    private static void doOnNext() {
        Observable
                .just(1, 2, 3)
                .doOnNext(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        if (Math.random() > 0.8)
                            throw new RuntimeException("throw Exception");
                    }
                })
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println(e.getMessage());
                    }

                    @Override
                    public void onNext(Integer integer) {
                        System.out.println("This is --> " + integer);
                    }
                });
    }

doOnEach简单使用

    private static void doOnEach() {
        Observable
                .just(1, 2, 3, 4)
                .doOnEach(new Action1<Notification<? super Integer>>() {
                    @Override
                    public void call(Notification<? super Integer> notification) {
                        System.out.println(notification.getKind()
                                + "---" + notification.getThrowable()
                                + "---" + notification.getValue());
                    }
                })
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println(e.getMessage());
                    }

                    @Override
                    public void onNext(Integer integer) {
                        System.out.println("This is --> " + integer);
                    }
                });
    }

运行结果:

OnNext---null---1
This is --> 1
OnNext---null---2
This is --> 2
OnNext---null---3
This is --> 3
OnNext---null---4
This is --> 4
OnCompleted---null---null
onCompleted

getKind()的值可以直接看作是触发信号

getThrowable()获取异常信息对象Throwable

getValue()值就是数据项

在输出结果的最后,当触发onCompleted()时,又进行了一次doOnEach()回调


1.2.2 doOnSubscribe(Action0)

Observable订阅Observer之前,会回调doOnSubcribe(),默认在subscribe()订阅线程执行,但可以通过subscribeOn()来指定执行线程,受其后最近的一个subscribeOn()影响

简单使用:

   private static void doOnSubscribe() {
       Observable
               .just(1,2,3,4)
               .doOnSubscribe(new Action0() {
                   @Override
                   public void call() {
                       System.out.println("-1");
                   }
               })
               .subscribeOn(Schedulers.io())
               .map(integer -> integer + 10)
               .subscribeOn(Schedulers.immediate())
               .subscribe(new Action1<Integer>() {
                   @Override
                   public void call(Integer integer) {
                       System.out.print(integer +", ");
                   }
               });    }

运行结果:

-1
11, 12, 13, 14

1.2.3 doOnTerminate(Action0)

doOnTerminate订阅了一个动作后,当它产生的Observable终止之前会被调用,无论是正常还是异常终止

简单使用:

    private static void doOnTerminate() {
        Observable
                .just(1, 2, 3, 4)
                .map(integer -> {
                    if (Math.random() < 0.8)
                        return integer + 10;
                    else
                        throw new RuntimeException("Throw Exception");
                })
                .doOnTerminate(new Action0() {
                    @Override
                    public void call() {
                        System.out.println("doOnTerminate --> -1");
                    }
                })
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println(e.getMessage());
                    }

                    @Override
                    public void onNext(Integer integer) {
                        System.out.println("This is --> " + integer);
                    }
                });
    }

无论是否抛出异常,都会在最终结束之前,输出打印doOnTerminate --> -1


1.3 TimeOut

原始Observable在指定的时间内没有发送任何数据项,就会发出onError()错误信号通知

timeout

简单使用:

    /**
     * 根据随机数,线程睡眠
     */
    private static void timeoutLong() {
        Observable
                .interval(1, TimeUnit.SECONDS, Schedulers.immediate())
                .map(aLong -> {
                    if (Math.random() > 0.8) {
                        try {
                            TimeUnit.SECONDS.sleep(2);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    return "This is -->" + aLong;
                })
                .timeout(2, TimeUnit.SECONDS)
                .limit(5)
                .subscribe(System.out::println);
    }

1.4 ObserveOn和SubscribeOn

  • ObserveOn指定观察者在哪个线程进行调度。可以理解为也就是指定onNext,onError,onCompleted执行的线程
  • SubscribeOn指定Observable被观察者自身所在的线程。

注意:遇到异常时,ObserveOn会立刻发送onError通知,不会等待慢速消费的Observable接受任何之前已经收到但还没有发送出去的数据项。


2. 最后

本人很菜,有错误,请指出

共勉 :)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,570评论 8 93
  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,819评论 0 10
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 887评论 0 3
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 2,178评论 2 8
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,435评论 7 62