版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yus201120/article/details/83106012
1、merge操作符、zip操作符和join操作符
merge是组合多个被观察者一起发送数据,合并后 按发送顺序串行执行。
zip合并后的新数组长度是两个数组中长度小的那个,并且合并的方式可以由我们自己定义。
join合并后的新数组是连个数组的乘积(较少用到)。
2、collect操作符
collect作用是将被观察者Observable发送的数据事件收集到一个数据结构里。
我们在项目中时常会遇到如下需求:一个recycleView展示列表数据,用户下拉刷新的时候请求更多数据,但同时,也可以往上面滑动浏览之前的内容。这个时候之前显示的数据也还是需要缓存下来的,加上最新请求的数据,一起返回给recycleView展示。
Observable<List<ArticleDetailData>> o1 = Observable
.fromIterable(new ArrayList<ArticleDetailData>(articleCache.values())) //articleCache便是我们缓存的数据
.toSortedList(new Comparator<ArticleDetailData>() {
@Override
public int compare(ArticleDetailData o1, ArticleDetailData o2) {
return SortDataSourceUtil.sortArticleData(o1,o2); //这里比较每一项的时间,做了一个排序
}
}).toObservable();
Observable<List<ArticleDetailData>> o2 = remoteResource.getArticles(page,forceUpdate,clearCache)
.doAfterNext(new Consumer<List<ArticleDetailData>>() {
@Override
public void accept(List<ArticleDetailData> articleDetailData) throws Exception {
refreshArticleCache(clearCache,articleDetailData); //把请求的数据做缓存
}
});
这个时候只是简单地用merge,把网络请求和本地缓存中两个请求放一起,是不行的,由于本地数据获取很快,这样子只会先返回缓存数据再返回网络请求数据,导致刷新的数据不是我们想要的。这个时候我们需要在merge后面再用collect操作符,把两个数据源收集到一起之后再反馈给界面刷新。
//获取到的缓存数据加上新请求的数据,合并到一起发送
return Observable.merge(o1,o2)
.collect(new Callable<List<ArticleDetailData>>() { //在这里定义返回的数据类型
@Override
public List<ArticleDetailData> call() throws Exception {
return new ArrayList<>();
}
}, new BiConsumer<List<ArticleDetailData>, List<ArticleDetailData>>() {
@Override //collectlist就是容器,datalist就是要收集的数据
public void accept(List<ArticleDetailData> collectlist, List<ArticleDetailData> datalist) throws Exception {
collectlist.addAll(datalist);
}
}) .toObservable();