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

上次记录了下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,由于可以当发射源,所以可以用它进行发射数据。由于基本基本用不上,所以我也不多说了,知道下就行了。很简单的,如果想学习的可以网上搜。

发布了33 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/gsw333/article/details/70858546
今日推荐