RXJava 2.0操作符学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();

猜你喜欢

转载自blog.csdn.net/yus201120/article/details/83106012