分分钟学会RxAndroid的使用(二)

 上一篇介绍了RxAndroid最基本的使用,这篇将介绍一下RxAndroid的操作符,也是实现链式结构的核心api。

常用的操作符主要有以下几种:

map操作符:主要是用于对象间类型的转换,如一下例子,将byte数组转换成了String类型

byte [] b=new byte[]{'a','b'};
                byte [] b2=new byte[]{'c','d'};

                Observable.just(b,b2) //所有byte数组都的都执行
                       .map(new Func1<byte[], String>() {
                           @Override
                           public String call(byte[] bytes) {

                               return new String(bytes);
                           }
                       })
                .subscribe(new Action1<String>() { //action1 只是在只调用onnext 时能使用
                    @Override
                    public void call(String s) {
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
                    }
                });

flatMap的操作符:比较复杂的一个操作符,是通过一个observalbe调用另外一个Obervable对象。

String [][] s=new String[][]{{"11","12","13"},{"21","22","23"}};

               /* Observable.from(s).flatMap(new Func1<String[], Observable<String>>() {
                    @Override
                    public Observable<String> call(String[] s) {
                        Log.e("Mainactivity",""+11111);
                        for (String a:s
                             ) {
                            Log.e("Mainactivity",""+a);
                        }
                        Log.e("Mainactivity","-------");
                        return Observable.from(s);
                    }
                }).subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
                    }
                });*/
                //------------------------------华丽的分割线----------------------------------------------------
                //转换了数据类型
                //注意 flatmap的操作符中需要返回一个Observable.from()类型 而Observable.from()需要一个iterable类型的参数
               Observable.from(s).flatMap(new Func1<String[], Observable<Integer>>() {
                    @Override
                    public Observable<Integer> call(String[] s) {
                        Log.e("Mainactivity",""+11111);
                        for (String a:s
                                ) {
                            Log.e("Mainactivity",""+a);
                        }
                        Log.e("Mainactivity","-------");
                        return toInteger(s);
                    }
                }).subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {<pre name="code" class="java">

 

filter操作符:顾名思义,过滤想要的。

String [] sss=new String[]{"你是傻逼吗","我不是","你才是"};
                Observable.from(sss)
                        .filter(new Func1<String, Boolean>() {
                            @Override
                            public Boolean call(String s) {

                                return !"我不是".equals(s);
                            }
                        })
                        .doOnCompleted(new Action0() {
                            @Override
                            public void call() {//所有的执行完成才会执行此方法 在数据更新之后可以安全使用更新ui
                                Log.e("aaaa","aa执行完了");
                            }
                        })
                        .doOnError(new Action1<Throwable>() { //不起作用? 待考证
                            @Override
                            public void call(Throwable throwable) {
                                Log.e("aaaa","aa执行错误了");
                            }
                        })
                        .doOnNext(new Action1<String>() {
                            @Override
                            public void call(String s) {
                                try {
                                    Log.e("aaaa","aa休息了");
                                    Thread.sleep(1000); //测试执行的先后顺序 测试时可以调大一点方便测试
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                Toast.makeText(MainActivity.this,s+"a",Toast.LENGTH_SHORT).show();
                            }
                        })//执行其他操作  这是串行的需要 执行完成后才执行其他的
                        .take(3)//过滤后需要的数量
                        .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e("bbbb","bb");

//                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
                    }
                });

filter比较简单,没有单一的介绍filter的使用,混合了一些其他的api,代码中注释详细,不做过多的解释。比较常用的操作符基本就是这些,以后学了更多的之后再来补充。测试代码之前发过,还是再发一遍:

RxAndroid测试demo

补充:关于原理可以查看这篇文章→给 Android 开发者的 RxJava 详解  写的比我详细多了,刚开始写博客心比较浮躁,希望以后会改掉这毛病吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值