電商類的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ò)誤通知