Rxjava操作符飆車系列,(六)數(shù)據(jù)合并

電商類的app,購物車是必不可少的,用戶往購物車添加數(shù)據(jù)的時(shí)候,如果因?yàn)橐恍┰颍瑳]有傳到服務(wù)器上就很尷尬了,但是也確實(shí)可能存在。所以可以把數(shù)據(jù)緩存到本地,當(dāng)打開購物車的時(shí)候讓網(wǎng)絡(luò)請求的數(shù)據(jù)和本地的數(shù)據(jù)進(jìn)行合并是最好的。

本次關(guān)于Rxjava的操作符主要用到的是Merge。
關(guān)于Merge的官方介紹請看http://reactivex.io/documentation/operators/merge.html

Merge

Merge其實(shí)只是將多個(gè)Obsevables的輸出序列變?yōu)橐粋€(gè),合并多個(gè)Observable的發(fā)射物,方便訂閱者統(tǒng)一處理,對于訂閱者來說就仿佛只訂閱了一個(gè)觀察者一樣。
關(guān)于數(shù)據(jù)合并的操作符還有Zip,待會(huì)在介紹它

還是直接上代碼清晰明了。

 //從本地拿數(shù)據(jù)
private Observable<List<Course>> getDataFromLocal(){
    List<Course> list=new ArrayList<>();
    list.add(new Course());
    return Observable.just(list);

}

//從網(wǎng)絡(luò)拿數(shù)據(jù)
private Observable<List<Course>> getDataFromNet(){
    return api.getCar().subscribeOn(Schedulers.io());
}     

private void mergeData(){
    //merge 合并多個(gè)Observable的發(fā)射物
    Observable.merge(getDataFromLocal(),getDataFromNet())
            .subscribe(new Consumer<List<Course>>() {
                @Override
                public void accept(List<Course> courses) throws Exception {

                    //顯示在recyclerView上
                }
            });

}

以上就是關(guān)于merge的簡單使用了,是不是很簡單啊,接下來在給大家說一下另一個(gè)數(shù)據(jù)集合的操作符Concat和Zip

Concat

關(guān)于concat的官方介紹請看 http://reactivex.io/documentation/operators/concat.html

Concat和Merge的區(qū)別是: merge組合的多個(gè)Observable在不同線程并發(fā)發(fā)射時(shí),收到的數(shù)據(jù)可能會(huì)交錯(cuò),而concat則無論怎樣都不會(huì)交錯(cuò),都是按順序接收。

Zip

關(guān)于zip的官方介紹:http://reactivex.io/documentation/operators/zip.html

同樣的兩次請求數(shù)據(jù),一次本地,一次網(wǎng)絡(luò),但是我們想讓用戶只使用一次等待加載的過程。所以說,我們需要等待這兩個(gè)請求都返回結(jié)果了,再開始顯示數(shù)據(jù)。這樣會(huì)給用戶帶來更好的體驗(yàn)效果。

zip操作符并不是像merge操作符那樣只合并了數(shù)據(jù),重要的是發(fā)生了質(zhì)的變化。

狗子上代碼:

Observable.zip(getDataFromLocal(), getDataFromNet(), new BiFunction<List<Course>, List<Course>, Object>() {
        @Override
        public Object apply(List<Course> courses, List<Course> courses2) throws Exception {
            //各種掃操作
            return null;
        }
    });

這樣的話,你就可以分別對返回結(jié)果進(jìn)行操作了。

關(guān)于合并的操作符還有startWith

StartWith

在數(shù)據(jù)的開頭增加一項(xiàng)數(shù)據(jù)
http://reactivex.io/documentation/operators/startwith.html

Observable.just("a","b","c")
            .startWith("d")
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) throws Exception {
                    Log.e(TAG, "accept: "+s);
                }
            });

打印的結(jié)果:d,a,b,c

好了,關(guān)于數(shù)據(jù)合并的操作符就先介紹Merge,Concat,Zip,StartWith這四個(gè)吧,其實(shí)還有很多:

1. and() , then() , when():
通過模式(And條件)和計(jì)劃(Then次序)組合兩個(gè)或多個(gè)Observable發(fā)射的數(shù)據(jù)集

2. combineLatest():
當(dāng)兩個(gè)Observables中的任何一個(gè)發(fā)射了一個(gè)數(shù)據(jù)時(shí),通過一個(gè)指定的函數(shù)組合每個(gè)Observable發(fā)射的最新數(shù)據(jù)(一共兩個(gè)數(shù)據(jù)),然后發(fā)射這個(gè)函數(shù)的結(jié)果

3. join() , groupJoin():
無論何時(shí),如果一個(gè)Observable發(fā)射了一個(gè)數(shù)據(jù)項(xiàng),只要在另一個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng)定義的時(shí)間窗口內(nèi),就將兩個(gè)Observable發(fā)射的數(shù)據(jù)合并發(fā)射

4. switch():
將一個(gè)發(fā)射Observable序列的Observable轉(zhuǎn)換為這樣一個(gè)Observable:它逐個(gè)發(fā)射那些Observable最近發(fā)射的數(shù)據(jù)

5 switchOnNext():

將一個(gè)發(fā)射Observables的Observable轉(zhuǎn)換成另一個(gè)Observable,后者發(fā)射這些Observables最近發(fā)射的數(shù)據(jù)

6. mergeDelayError():
合并多個(gè)Observables,讓沒有錯(cuò)誤的Observable都完成后再發(fā)射錯(cuò)誤通知

666
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容