android之RxJava的学习,从浅到深,从入门到别放弃(二)

来源:互联网 发布:知乎可以用qq注册 编辑:程序博客网 时间:2024/05/09 04:52

上次记录了下RvJava的基本使用,即 android之RxJava的学习,从浅到深,从入门到别放弃(一),有些还是要补充下,忘了说RxJava的到底干嘛的。RxJava主要特点就是开发中经常需要用到的:异步,详细异步同步这些概念不用我解释了吧,当然异步你也一样用thread+handler或者asynctask,但是RxJava使用简洁方便,而且它的作用不仅仅于此。

之前说了RxJava的基本使用方法,接下来说下操作符,RxJava中强大的操作符,这也是它吸引人的地方。注意,操作符都是在接收数据之前执行的,也就是在subscribe之前执行,所以也可以称作数据的预处理。
操作符
1.Map,数据转换和预处理,例如根据一个员工查找他所属公司:

Observable.just(user).map(new Fuc1<User,Business>(){  @Override  public Business call(User user) {        ...       //根据user查找他所属的公司       return business;  }}).subscribe(new Action1<Business>() {   @Override  public void call(Business business) {       //获取到公司的name       Log.d("test","name="+business.name);  }});

注意:Func1方法在上次文章说过,跟Action1一样,只是有返回值,看上述代码第一行的Fucn1方法,User代表Func1的call方法的参数类型,也就是你just()方法发送的数据类型;School代表它的call方法的返回值类型,也就是后面subscribe的接收源call方法的参数类型。

2.FloatMap,可以将接收到的数据转换成发射源Observable发射出去,例如,很多个公司,我们需要所有的员工姓名,正常情况下,我们for循环公司列表businessList,然后在for循环里面对每个公司的员工列表userList再次for循环遍历打印员工姓名,如果用FloatMap:

Observable.from(businessList).floatMap(new Func1<Business, Obeservable<User>>(){        @Override        public Boolean call(Business business) {            return Observable.from(business.getUserList());        }    }).subscribe(new Action1<User>() {        @Override        public void call(User user) {        //获取user.name        }   });

3.Filter,过滤,根据条件过滤发射,例如只要大于5的数据:

List<Integer> list = Arrays.asList(3, 6, 4, 7, 12, 2, 9);Observable.from(list).filter(new Func1<Integer, Boolean>(){        @Override        public Boolean call(Integer integer) {            return integer > 5;        }    }).subscribe(new Action1<Integer>() {        @Override        public void call(Integer integer) {        //获取到大于5的数据        }   });

4.Take,发射前几项数据,例如:

List<Integer> list = Arrays.asList(3, 6, 4, 7, 12, 2, 9);        Observable.from(list).take(4).subscribe(new Action1<Integer>() {            @Override            public void call(Integer integer) {                MlogUtil.d(MlogUtil.MY_TEST, "huoqu:" + integer);            }        });

打印结果:3,6,4,7

5.Buffer,缓存,缓存一定数量的数据,然后以list形式发送出去,例如:

List<Integer> list = Arrays.asList(3, 6, 4, 7, 12, 2, 9);Observable.from(list).buffer(3).subscribe(new       Action1<List<Integer>>(){      @Override      public void call(List<Integer> integers) {           MlogUtil.d(MlogUtil.MY_TEST, "list:" +integers);      }});

输出结果:[3,6,4],[7,12,2],[9],设置了缓存数3,所以满了3个后就会发送list。

6.Distinct,去掉重复的,例如:

List<Integer> list = Arrays.asList(3, 6, 4, 7, 12, 6, 9);Observable.from(list).distinct().subscribe(new Action1<Integer>() {       @Override       public void call(Integer integer) {           MlogUtil.d(MlogUtil.MY_TEST,"数据:"+integer);       }});

结果是:3,6,4,7,12,9,重复的会过滤掉,是不是很方便?

以上操作符的使用都是举的简单的例子,所以看不出来它的牛逼之处,多用用多想想你会发现真的很牛逼很方便的,经常用的。
我之前说了,三个点:发射源,接收源,订阅,那么有些特殊的类,即可以当发射源又可以当接收源,主要是当发射源,那就是Subject,但是它是abstract的,所以不能直接new,但是它有几个实现类:AsyncSubject、BehaviorSubject、PublishSubject、ReplaySubject,由于可以当发射源,所以可以用它进行发射数据。由于基本基本用不上,所以我也不多说了,知道下就行了。很简单的,如果想学习的可以网上搜。

0 0
原创粉丝点击