RxJava组合/合并操作符

今天,来学习RxJava中的组合/合并操作符,并完成实例。

一、作用

组合多个被观察者&合并需要发送的事件

二、类型

常见的组合/合并操作符有:

1.组合多个被观察者

    a.按发送顺序:concat()、concatArray()

    b.按时间:merge()、mergeArray()

    c.错误处理:concatDelayError()、mergeDelayError()

 2.合并多个事件

    a.按数量:Zip()

    b.按时间:combineLatest()、combineLatestDelayError()

    c.合并成1个事件发送:reduce()、collect()

 3.发送事件前追加发送事件:startWith()、startWithArray()

 4.统计发送事件数量:count()

三、操作符及应用介绍

首先在项目中添加依赖:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'io.reactivex.rxjava2:rxjava:2.0.7'

1.组合多个被观察者

concat()/concatArray()

作用:组合多个被观察者发送数据,合并后按发送顺序串行执行

二者区别:组合被观察者的数量,即concat()组合被观察者数量≤4个,而concatArray()可以大于4个

具体使用:

//concat()

:组合多个被观察者

(≤4

)

一起发送数据

//

注:串行执行

Observable

.

concat

(

Observable

.

just

(

1

,

2

,

3

),

                        Observable

.

just

(

4

,

5

,

6

),

                        Observable

.

just

(

7

,

8

,

9

),

                        Observable

.

just

(

10

,

11

,

12

))

                    .subscribe(

new

Observer<Integer>() {

                        @Override

                        public void

onSubscribe(Disposable d) {

                        }

                        @Override

                        public void

onNext(Integer integer) {

                            Log.

e

(

tag

,

"

接收到了事件

"

+integer);

                        }

                        @Override

                        public void

onError(Throwable e) {

                            Log.

e

(

tag

,

""

);

                        }

                        @Override

                        public void

onComplete() {

                            Log.

e

(

tag

,

""

);

                        }

});

//concat()

:组合多个被观察者

(≤4

)

一起发送数据

//

注:串行执行

Observable

.

concatArray

(

Observable

.

just

(

1

,

2

,

3

),

Observable

.

just

(

4

,

5

,

6

),

Observable

.

just

(

7

,

8

,

9

),

Observable

.

just

(

10

,

11

,

12

),

                        Observable.just(13,14,15))

.subscribe(

new

Observer<Integer>() {

@Override

public void

onSubscribe(Disposable d) {

}

@Override

public void

onNext(Integer integer) {

Log.

e

(

tag

,

"

接收到了事件

"

+integer);

}

@Override

public void

onError(Throwable e) {

Log.

e

(

tag

,

""

);

}

@Override

public void

onComplete() {

Log.

e

(

tag

,

""

);

}

});

merge()/mergeArray

作用:

    组合多个被观察者一起发送数据,合并后按时间线并行执行
  1. 二者区别:组合被观察者的数量,即merge()组合被观察者数量≤4个,而mergeArray()则可>4个

  2. 区别上述concat()操作符:同样是组合多个被观察者一起发送数据,但concat()操作符合并后是按发送顺序串行执行

    具体使用:

//merge()组合多个被观察者(<4个)一起发送数据

// 注:合并后按照时间线并行执行

Observable.merge(Observable.intervalRange(1,2,1,1, TimeUnit.SECONDS),

                                Observable.intervalRange(1,3,10,1,TimeUnit.SECONDS))

        .subscribe(new Observer<Long>() {

                @Override

                public void onSubscribe(Disposable d) {

                }

                @Override

                public void onNext(Long aLong) {

                        Log.e(tag,"接收到了事件"+aLong);

                }

                @Override

                public void onError(Throwable e) {

                        Log.e(tag,"");

                }

                @Override

                public void onComplete() {

                        Log.e(tag,"complete");

                }

    });

//mergeArray()组合多个被观察者(>4个)一起发送数据

// 注:合并后按照时间线并行执行

Observable.mergeArray(Observable.intervalRange(1,2,1,1, TimeUnit.SECONDS),

                        Observable.intervalRange(1,3,10,1,TimeUnit.SECONDS),

                        Observable.intervalRange(1,2,1,1, TimeUnit.SECONDS),

                        Observable.intervalRange(1,3,10,1,TimeUnit.SECONDS),

                        Observable.intervalRange(1,2,1,1, TimeUnit.SECONDS),

                        Observable.intervalRange(1,3,10,1,TimeUnit.SECONDS))

.subscribe(new Observer<Long>() {

    @Override

    public void onSubscribe(Disposable d) {

    }

    @Override

    public void onNext(Long aLong) {

        Log.e(tag,"接收到了事件"+aLong);

    }

    @Override

    public void onError(Throwable e) {

        Log.e(tag,"");

    }

    @Override

    public void onComplete() {

        Log.e(tag,"complete");

    }

});

concatDelayError()/mergeDelayError()

作用:

[图片上传失败...(image-4c0cf4-1512547073721)]

具体使用:

Observable

.

concatArrayDelayError

(

    Observable

.

create

(

new

ObservableOnSubscribe<Integer>() {

        @Override

        public void

subscribe(ObservableEmitter<Integer> emitter)

throws

Exception {

            emitter.onNext(

1

);

            emitter.onNext(

2

);

            emitter.onNext(

3

);

            emitter.onError(

new

NullPointerException());

//

发送

Error

事件,因为使用了

concatDelayError

,所以第

2

Observable

将会发送事件,等发送完毕后,再发送错误事件

            emitter.onComplete();

        }

}),

Observable

.

just

(

4

,

5

,

6

))

.subscribe(

new

Observer<Integer>() {

@Override

public void

onSubscribe(Disposable d) {

}

@Override

public void

onNext(Integer value) {

    Log.

d

(

tag

,

"

接收到了事件

"

  • value );

    }

@Override

public void

onError(Throwable e) {

    Log.

d

(

tag

,

"

Error

事件作出响应

"

);

}

@Override

public void

onComplete() {

    Log.

d

(

tag

,

"

Complete

事件作出响应

"

);

}

});

2.合并多个事件

    该类型操作符主要是对多个被观察者中的事件进行合并处理。

Zip()

作用:合并多个被观察者发送的事件,生成一个新的事件序列,最终发送。

原理:

[图片上传失败...(image-55bcd1-1512547073721)]

注意:事件组合方式=严格按照原先的事件序列进行对位合并

    最终合并的事件数量=

多个被观察者中数量最少的数量

combineLatest()

作用:当两个Observables中的任何一个发送了数据后,将先发送了数据的Observables的最新(最后)一个数据与另外一个Observable发送的每个数据结合,最终基于该函数的结果发送数据。

与Zip()的区别:

zip()=按个数合并,即1对1合并;CombineLatest()=按时间合并,即在同一个时间点上合并

combineLatestDelayError()

作用类似于

concatDelayError()

/

mergeDelayError()

,即错误处理,此处不作过多描述

reduce()

作用:把被观察者要发送的事件聚合成1个事件&发送

collect()

作用:将被观察者Observable发送的数据事件收集到一个数据结构里

startWith()/startWithArray()

作用:在一个被观察者发送事件前,追加发送一些数据/一个新的被观察者。

Observable.

just

(

4

,

5

,

6

)

    .startWith(

0

)

//

追加单个数据

= startWith()

    .

startWithArray

(

1

,

2

,

3

)

//

追加多个数据

= startWithArray()

    .subscribe(

new

Observer<Integer>() {

        @Override

        public void

onSubscribe(Disposable d) {

        }

        @Override

        public void

onNext(Integer value) {

            Log.

d

(

tag

,

"

接收到了事件

"

  • value );

          }
    
          @Override
    
          public void
    

onError(Throwable e) {

                Log.

d

(

tag

,

"

Error

事件作出响应

"

);

        }

        @Override

        public void

onComplete() {

            Log.

d

(

tag

,

"

Complete

事件作出响应

"

);

        }

});

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

推荐阅读更多精彩内容