RXJava 2.0操作符学习

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();

3、Map操作符
Map是RXJava中最简单的变化操作符,它负责把事件中的数据变化成另外一个数据然后再继续发送。

  Observable.create(new ObservableOnSubscribe<Integer>() {

            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onComplete();
            }
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {

                return "index:+"+String.valueOf(integer);  //把数字转换成字符
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.i("dd",s);
            }
        });

4、FlatMap操作符
flatmap是把被观察Observable的一个事件转换成多个发送事件的Observable,但是这些转换的Observable的顺序不能够保证。比如一个网络请求返回的数据中包含了一个集合,我们用到这个集合的时候,可能就需要它这个集合“降维打击”,把它里面的每个数据变成一个Observable来发送。

RetrofitClient
                .getInstance()
                .create(RetrofitService.class)
                .getArticles(page)
                .filter(new Predicate<ArticlesData>() {
                    @Override
                    public boolean test(ArticlesData articlesData) throws Exception {
                        return articlesData.getErrorCode() !=-1;
                    }
                })
                .flatMap(new Function<ArticlesData, ObservableSource<List<ArticleDetailData>>>() {
                    @Override
                    public ObservableSource<List<ArticleDetailData>> apply(ArticlesData articlesData) throws Exception {
                        return Observable.fromIterable(articlesData.getData().getDatas())
                                .toSortedList(new Comparator<ArticleDetailData>() {
                                    @Override
                                    public int compare(ArticleDetailData o1, ArticleDetailData o2) {
                                        return SortDataSourceUtil.sortArticleData(o1,o2);
                                    }
                                }).toObservable();  //这里把data里面的数据集合取出来然后变化成数据集合的发送
                    }
                });

concatMap和flatmap的作用和使用几乎一样,只是concatMap变化后的发送严格按照变化之前的顺序发送。

5、subscribeOn操作符
subscribeOn是用来切换线程使用的操作符,它可以指定产生事件的线程,也可以指定消费事件的线程。RXJava内部给我们提供了四种线程类型,基本上可以满足我们日常的需求:
Schedulers.io():网络请求或者其他io的操作线程
Schedulers.computation():计算型线程,比较消耗CPU
Schedulers.newThread():一个常规的新的子线程
AndroidSchedulers.mainThread():UI主线程

Disposable disposable = dataRepository.getArticles(page,forceUpdate,clearCache)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableObserver<List<ArticleDetailData>>() {
                    @Override
                    public void onNext(List<ArticleDetailData> value) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

        compositeDisposable.add(disposable);

6、filter操作符
filter是一个过滤的操作符,把发射的事件经过一定条件的过滤,才传给下游处理。

filter(new Predicate<ArticlesData>() {
                    @Override
                    public boolean test(ArticlesData articlesData) throws Exception {
                        return articlesData.getErrorCode() !=-1;    //返回等于true的时候,表示可以通过过滤;false就表示此事件会被过滤掉
                    }
                })

7、sample操作符
这个操作符表示每隔多少时间从上游取出一个事件发送给下游处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值