RxJava組合/合并操作符

今天心肪,來學習RxJava中的組合/合并操作符,并完成實例递雀。

一泵喘、作用

組合多個被觀察者&合并需要發(fā)送的事件

二众眨、類型

常見的組合/合并操作符有:

1.組合多個被觀察者

    a.按發(fā)送順序:concat()、concatArray()

    b.按時間:merge()阻逮、mergeArray()

    c.錯誤處理:concatDelayError()粱快、mergeDelayError()

 2.合并多個事件

    a.按數(shù)量:Zip()

    b.按時間:combineLatest()、combineLatestDelayError()

    c.合并成1個事件發(fā)送:reduce()叔扼、collect()

 3.發(fā)送事件前追加發(fā)送事件:startWith()事哭、startWithArray()

 4.統(tǒng)計發(fā)送事件數(shù)量:count()

三、操作符及應用介紹

首先在項目中添加依賴:

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

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

1.組合多個被觀察者

concat()/concatArray()

作用:組合多個被觀察者發(fā)送數(shù)據(jù)瓜富,合并后按發(fā)送順序串行執(zhí)行

二者區(qū)別:組合被觀察者的數(shù)量鳍咱,即concat()組合被觀察者數(shù)量≤4個,而concatArray()可以大于4個

具體使用:

//concat()

:組合多個被觀察者

(≤4

)

一起發(fā)送數(shù)據(jù)

//

注:串行執(zhí)行

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

)

一起發(fā)送數(shù)據(jù)

//

注:串行執(zhí)行

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

作用:

    組合多個被觀察者一起發(fā)送數(shù)據(jù)与柑,合并后按時間線并行執(zhí)行
  1. 二者區(qū)別:組合被觀察者的數(shù)量谤辜,即merge()組合被觀察者數(shù)量≤4個,而mergeArray()則可>4個

  2. 區(qū)別上述concat()操作符:同樣是組合多個被觀察者一起發(fā)送數(shù)據(jù)价捧,但concat()操作符合并后是按發(fā)送順序串行執(zhí)行

    具體使用:

//merge()組合多個被觀察者(<4個)一起發(fā)送數(shù)據(jù)

// 注:合并后按照時間線并行執(zhí)行

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個)一起發(fā)送數(shù)據(jù)

// 注:合并后按照時間線并行執(zhí)行

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());

//

發(fā)送

Error

事件干旧,因為使用了

concatDelayError

渠欺,所以第

2

Observable

將會發(fā)送事件,等發(fā)送完畢后椎眯,再發(fā)送錯誤事件

            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()

作用:合并多個被觀察者發(fā)送的事件胳岂,生成一個新的事件序列,最終發(fā)送舔稀。

原理:

[圖片上傳失敗...(image-55bcd1-1512547073721)]

注意:事件組合方式=嚴格按照原先的事件序列進行對位合并

    最終合并的事件數(shù)量=

多個被觀察者中數(shù)量最少的數(shù)量

combineLatest()

作用:當兩個Observables中的任何一個發(fā)送了數(shù)據(jù)后乳丰,將先發(fā)送了數(shù)據(jù)的Observables的最新(最后)一個數(shù)據(jù)與另外一個Observable發(fā)送的每個數(shù)據(jù)結合,最終基于該函數(shù)的結果發(fā)送數(shù)據(jù)内贮。

與Zip()的區(qū)別:

zip()=按個數(shù)合并产园,即1對1合并;CombineLatest()=按時間合并夜郁,即在同一個時間點上合并

combineLatestDelayError()

作用類似于

concatDelayError()

/

mergeDelayError()

什燕,即錯誤處理,此處不作過多描述

reduce()

作用:把被觀察者要發(fā)送的事件聚合成1個事件&發(fā)送

collect()

作用:將被觀察者Observable發(fā)送的數(shù)據(jù)事件收集到一個數(shù)據(jù)結構里

startWith()/startWithArray()

作用:在一個被觀察者發(fā)送事件前竞端,追加發(fā)送一些數(shù)據(jù)/一個新的被觀察者屎即。

Observable.

just

(

4

,

5

,

6

)

    .startWith(

0

)

//

追加單個數(shù)據(jù)

= startWith()

    .

startWithArray

(

1

,

2

,

3

)

//

追加多個數(shù)據(jù)

= 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()統(tǒng)計發(fā)送事件數(shù)量
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市事富,隨后出現(xiàn)的幾起案子技俐,更是在濱河造成了極大的恐慌,老刑警劉巖统台,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雕擂,死亡現(xiàn)場離奇詭異,居然都是意外死亡贱勃,警方通過查閱死者的電腦和手機井赌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來募寨,“玉大人族展,你說我怎么就攤上這事“斡ィ” “怎么了仪缸?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長列肢。 經常有香客問我恰画,道長,這世上最難降的妖魔是什么瓷马? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任拴还,我火速辦了婚禮梯捕,結果婚禮上倒得,老公的妹妹穿的比我還像新娘趁冈。我一直安慰自己,他們只是感情好哩都,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布砸脊。 她就那樣靜靜地躺著涡匀,像睡著了一般拴事。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弓摘,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天焚鹊,我揣著相機與錄音,去河邊找鬼韧献。 笑死末患,一個胖子當著我的面吹牛,可吹牛的內容都是我干的锤窑。 我是一名探鬼主播璧针,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼果复!你這毒婦竟也來了陈莽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虽抄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后独柑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迈窟,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年忌栅,在試婚紗的時候發(fā)現(xiàn)自己被綠了车酣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡索绪,死狀恐怖湖员,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瑞驱,我是刑警寧澤娘摔,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站唤反,受9級特大地震影響凳寺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜彤侍,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一肠缨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏阶,春花似錦晒奕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魄眉。三九已至,卻和暖如春漾橙,著一層夾襖步出監(jiān)牢的瞬間杆融,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工霜运, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脾歇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓淘捡,卻偏偏與公主長得像藕各,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子焦除,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • 注:只包含標準包中的操作符激况,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,195評論 2 8
  • 作者: maplejaw本篇只解析標準包中的操作符。對于擴展包膘魄,由于使用率較低乌逐,如有需求,請讀者自行查閱文檔创葡。 創(chuàng)...
    maplejaw_閱讀 45,668評論 8 93
  • 注:只包含標準包中的操作符浙踢,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 934評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)灿渴,斷路器洛波,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 我愛有你的時光!
    7386a47461a5閱讀 434評論 1 2