美文网首页
RXJAVA的使用

RXJAVA的使用

作者: XINHAO_HAN | 来源:发表于2017-10-30 15:17 被阅读0次

    Rxjava的引入:
    compile 'io.reactivex.rxjava2:rxjava:2.0.5'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

    作者:XINHAO_HAN

    RxJava的简单使用:<原理就是一个发射器,和一个接收器,类似回调>
    1.先创建发射器:(Observable<T>)

      Observable<String> observable = Observable.create(new   Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    subscriber.onNext("XINHAO_HAN");
                    subscriber.onStart();
    
                }
            });
    

    2.创建接收器<Observer<T>>

     Observer<String> o = new Observer<String>() {
                @Override
                public void onCompleted() {
    
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
                @Override
                public void onNext(String s) {
                    Log.e("数据接收", "onNext: " + s);
    
                }
            };
    

    3.绑定发射器与接收器(发射器. subscribe(接收器);)//通俗一点

     observable.subscribe(o);
    

    这就是RXJAVA简单地使用,看到这你会说一句waht?这个能干毛?,0.0 别急,重要的是在后边哟~~~~

    但是你会觉得别人和我自己写的不一样呀,别人的都是比较高大上,为啥这个功能这么简单,还那么多代码,额....

    那个是链式编程,我们改动一下,这样就会自动绑定

    
            Observable.create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    subscriber.onNext("XINHAO_HAN");
                    subscriber.onStart();
    
                }
            }).subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {
    
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
                @Override
                public void onNext(String s) {
                    Log.e("数据接收", "onNext: " +s );
    
                }
            });
    
    

    如果你不需要这两个方法

    @Override
                public void onCompleted() {
    
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
    

    可重写<在不考虑失败,和接收到数据之前的情况下>

    new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.e("数据接收", "call: " +s );
                }
            }
    

    好啦~这就是RXJAVA的使用,what?你在逗我?这个是个毛线,你拿这个出来搪塞我啊.
    哈哈~~~当然不是啦
    先给你介绍几个东西在我自己理解的情况下,它是这样的,然后你先加什么东西,就随便啦~~~

    创建发射器( Observable<T>)
                        .功能1(other)
                        .功能2(other)
                        .功能3(other)
                         ... (other...)
                        .接收器(Observer<T>)//数据会被每个功能统统揍一遍,然后会回到接收器
    
    

    介绍一个东东..<filter>方法

    .filter(new Func1<String, Boolean>() {
                @Override
                public Boolean call(String s) {
                    return null;
                }
            })
    

    filter(过滤器,拦截器,把不需要的拦截掉)--方法它有1个参数看见方法名应该就会知道吧,它是一个返回Boolean的值,如果是false数据就会在这一个节点死去,不会再往下一个节点传递,
    比如

     Observable.create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    subscriber.onNext("XINHAO_HAN");
                    subscriber.onStart();
    
                }
            }).filter(new Func1<String, Boolean>() {
                @Override
                public Boolean call(String s) {
                    return s.equals("123");
                }
            })
                    .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.e("数据接收", "call: " +s );
                }
    

    这段的用意就是如果"XINHAO_HAN"与"123"相等就继续往下传直到接收器,如果不相等,就在这块被过滤器大哥BB了~~最终运行结果,就是------->毛都没有,啊啊哈哈哈哈哈哈,233333333333 0.0
    好啦好啦~来继续下一个

    flatMap(平面地图,什么鬼?在我理解它是一个机枪,把一个个子弹发射出去,what?什么鬼?ArrayList相当于一个弹夹,它会逐个往下传递ArrayList的中每一个数据)
    比如:

    //我创建一个ArrayList的字符创为 "1","2","3","4"....."100"
      ArrayList<String> arr = new ArrayList<>();
    
            for (int i = 0; i < 100; i++) {
    
                arr.add(i + "");
            }
    

    //然后这样<切记>

    注意注意注意
    WARNING!!!!!WARNING!!!!WARNING
    //你创建这个时候下一个节点会报错,因为它没识别你的数据类型把 "?" 改为你想要的数据类型

    flatMap(new Func1<String, Observable<?>>() {
                @Override
                public Observable<?> call(String s) {
                    return null;
                }
            })
    

    比如我是String类型的

    .flatMap(new Func1<String, Observable<String>>() {
                @Override
                public Observable<String> call(String s) {
                    return null;
                }
    

    //这样下一级的节点才能正确识别你的数据类型

    OK来看看这个节点有什么用吧~~~~

      final ArrayList<String> arr = new ArrayList<>();
    
            for (int i = 0; i < 100; i++) {
    
                arr.add(i + "");
            }
    
            Observable.create(new Observable.OnSubscribe<ArrayList<String>>() {
                @Override
                public void call(Subscriber<? super ArrayList<String>> subscriber) {
                    subscriber.onNext(arr);
                    subscriber.onStart();
    
                }
            }).flatMap(new Func1<ArrayList<String>, Observable<String>>() {
                @Override
                public Observable<String> call(final ArrayList<String> strings) {
                    return Observable.create(new Observable.OnSubscribe<String>() {
                        @Override
                        public void call(Subscriber<? super String> subscriber) {
    
                            for (int i = 0; i < strings.size(); i++) {
                                subscriber.onNext(strings.get(i));
    
                            }
    
                        }
                    });
    
                }
            }).subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
    
                    Log.e("数据接收", "call: " + s);
                }
            });
    

    LOG:

    10-30 14:55:06.560 2520-2520/com.example.administrator.xinhao_han_utils E/数据接收: call: 0
    10-30 14:56:35.255 4161-4161/com.example.administrator.xinhao_han_utils E/数据接收: call: 0
    10-30 14:56:35.255 4161-4161/com.example.administrator.xinhao_han_utils E/数据接收: call: 1
    .....
    .....
    10-30 14:56:35.258 4161-4161/com.example.administrator.xinhao_han_utils E/数据接收: call: 99
    
    

    直接懵逼了,我曹这都是啥啥啥?????这是什么操作?别急嘛,flatMap上边解释像机关枪一样把弹夹(集合)一个个打出去,这个观念就差不多,
    flatMap是重复创建一个发射器,然后onNext就是一个一个往出打,嗯,明白了木???T.T
    你看见那个for循环就知道干嘛了嘛.这个要慢慢理,实在不理解就想成机关枪0.0

    仅仅在便利集合当中当做机关枪,然而,它就只是单纯的又创建了一个发车器老司机滴滴滴

    好啦,接下来我们做一个输出所有能 | 被2整除 | 的数据

    被2整除

     final ArrayList<String> arr = new ArrayList<>();
    
            for (int i = 0; i < 100; i++) {
    
                arr.add(i + "");
            }
    
            Observable.create(new Observable.OnSubscribe<ArrayList<String>>() {
                @Override
                public void call(Subscriber<? super ArrayList<String>> subscriber) {
                    subscriber.onNext(arr);
                    subscriber.onStart();
    
                }
            }).flatMap(new Func1<ArrayList<String>, Observable<String>>() {
                @Override
                public Observable<String> call(final ArrayList<String> strings) {
                    return Observable.create(new Observable.OnSubscribe<String>() {
                        @Override
                        public void call(Subscriber<? super String> subscriber) {
    
                            for (int i = 0; i < strings.size(); i++) {
                                subscriber.onNext(strings.get(i));
    
                            }
    
                        }
                    });
    
                }
            }).filter(new Func1<String, Boolean>() {
                @Override
                public Boolean call(String s) {
                    int i = Integer.parseInt(s);
                    if (i % 2 == 0) {
                        return true;
                    } else {
                        return false;
                    }
    
    
                }
            }).subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
    
                    Log.e("数据接收", "call: " + s);
                }
            });
    

    LOG

    10-30 15:05:32.318 12765-12765/? E/数据接收: call: 0
    10-30 15:05:32.318 12765-12765/? E/数据接收: call: 2
    10-30 15:05:32.318 12765-12765/? E/数据接收: call: 4
    ....
    ....
    10-30 15:05:32.320 12765-12765/? E/数据接收: call: 94
    10-30 15:05:32.320 12765-12765/? E/数据接收: call: 96
    10-30 15:05:32.320 12765-12765/? E/数据接收: call: 98
    

    来来来,现在是map节点:

    map(地图)节点:what 地图节点??什么意思?不明白这个玩意有何用?别急小帅哥西路,来进来玩呀~~~

    我们看一下就明白了,这个玩意是干嘛的,啥?你说啥?你不明白? T.T,无语了啊......
    他就是给你暴露出你当前的String值

    .map(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return null;
                }
            })
    

    比如 你在发射器当中写的是"XINHAO_HAN"好吧..还是我名字的全拼,啦啦啦啦~

    .map(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return "小帅哥进来玩呀";// <- 我在这改成了这个值
                }
            })
    

    你猜接收器会有什么东西,对!你的直觉对了!没错!就是这个东东!----> "小帅哥进来玩呀"
    它吧"XINHAO_HAN" 该成了 "小帅哥进来玩呀",但你又说了这个又有什么用,我的哥,T.T
    好吧我给你解释

    这个就像你去数据库查询一个东西,我拿ID去查NAME,String就是返回的UUID,我查询到名字<NAME>字段,return 数据库查询到的名字,这个是根据业务需求来更改的.

    来下一个节点 doOnNext

    .doOnNext(new Action1<String>() {
                      @Override
                      public void call(String string) {
                        //在这里处理
                      }
                  })
    

    这个节点就是暂时把数据暴露给你,让你存储,或者其它操作0.0

    //Schedulers.newThread()是相当于new 了一个子线程
    //Schedulers.io()在IO线程运行

    .subscribeOn(Schedulers.newThread())//请求在新的线程中执行
                          .observeOn(Schedulers.io())  
    //切回主线程
                         .observeOn(AndroidSchedulers.mainThread())
    

    RXJAVA入门到此结束,0.0,结束啦,来来来挤一挤挤一挤,下一个讲retrofit,

    作者XINHAO_HAN,谢谢大家支持~~~

    相关文章

      网友评论

          本文标题:RXJAVA的使用

          本文链接:https://www.haomeiwen.com/subject/bbbppxtx.html