电商类的app,购物车是必不可少的,用户往购物车添加数据的时候,如果因为一些原因,没有传到服务器上就很尴尬了,但是也确实可能存在。所以可以把数据缓存到本地,当打开购物车的时候让网络请求的数据和本地的数据进行合并是最好的。
本次关于Rxjava的操作符主要用到的是Merge。
关于Merge的官方介绍请看http://reactivex.io/documentation/operators/merge.html
Merge
Merge其实只是将多个Obsevables的输出序列变为一个,合并多个Observable的发射物,方便订阅者统一处理,对于订阅者来说就仿佛只订阅了一个观察者一样。
关于数据合并的操作符还有Zip,待会在介绍它
还是直接上代码清晰明了。
//从本地拿数据
private Observable> getDataFromLocal(){
List list=new ArrayList<>();
list.add(new Course());
return Observable.just(list);
}
//从网络拿数据
private Observable> getDataFromNet(){
return api.getCar().subscribeOn(Schedulers.io());
}
private void mergeData(){
//merge 合并多个Observable的发射物
Observable.merge(getDataFromLocal(),getDataFromNet())
.subscribe(new Consumer>() {
@Override
public void accept(List courses) throws Exception {
//显示在recyclerView上
}
});
}
以上就是关于merge的简单使用了,是不是很简单啊,接下来在给大家说一下另一个数据集合的操作符Concat和Zip
Concat
关于concat的官方介绍请看 http://reactivex.io/documentation/operators/concat.html
Concat和Merge的区别是: merge组合的多个Observable在不同线程并发发射时,收到的数据可能会交错,而concat则无论怎样都不会交错,都是按顺序接收。
Zip
关于zip的官方介绍:http://reactivex.io/documentation/operators/zip.html
同样的两次请求数据,一次本地,一次网络,但是我们想让用户只使用一次等待加载的过程。所以说,我们需要等待这两个请求都返回结果了,再开始显示数据。这样会给用户带来更好的体验效果。
zip操作符并不是像merge操作符那样只合并了数据,重要的是发生了质的变化。
狗子上代码:
Observable.zip(getDataFromLocal(), getDataFromNet(), new BiFunction, List, Object>() {
@Override
public Object apply(List courses, List courses2) throws Exception {
//各种扫操作
return null;
}
});
这样的话,你就可以分别对返回结果进行操作了。
关于合并的操作符还有startWith
StartWith
在数据的开头增加一项数据
http://reactivex.io/documentation/operators/startwith.html
Observable.just("a","b","c")
.startWith("d")
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "accept: "+s);
}
});
打印的结果:d,a,b,c
好了,关于数据合并的操作符就先介绍Merge,Concat,Zip,StartWith这四个吧,其实还有很多:
1. and() , then() , when():
通过模式(And条件)和计划(Then次序)组合两个或多个Observable发射的数据集
2. combineLatest():
当两个Observables中的任何一个发射了一个数据时,通过一个指定的函数组合每个Observable发射的最新数据(一共两个数据),然后发射这个函数的结果
3. join() , groupJoin():
无论何时,如果一个Observable发射了一个数据项,只要在另一个Observable发射的数据项定义的时间窗口内,就将两个Observable发射的数据合并发射
4. switch():
将一个发射Observable序列的Observable转换为这样一个Observable:它逐个发射那些Observable最近发射的数据
5 switchOnNext():
将一个发射Observables的Observable转换成另一个Observable,后者发射这些Observables最近发射的数据
6. mergeDelayError():
合并多个Observables,让没有错误的Observable都完成后再发射错误通知