zoukankan      html  css  js  c++  java
  • RxJava操作符的简单使用

    一、准备工作在app的build.gradle文件下的dependencies中添加依赖:

        compile 'io.reactivex:rxjava:1.3.0'
        compile 'io.reactivex:rxandroid:1.2.1'

    二、RxJava的操作符用法:

    1、create

    //create  创建Observable
            //Observable 被观察者
            //Subscribers观察者
    
            Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    Log.i(TAG,"call.....");
                    if(!subscriber.isUnsubscribed()) {
                        subscriber.onNext("我被执行了1"); //只有完成了下面的订阅方法才能执行onNext等方法
                        subscriber.onNext("我被执行了2");
                        subscriber.onNext("我被执行了3");
                        subscriber.onNext("我被执行了4");
                        subscriber.onNext("我被执行了5");
                        subscriber.onNext("我被执行了6");
    
                        subscriber.onCompleted();
                    }
                }
            });
    
            //完成订阅
            observable.subscribe(new Subscriber<String>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG,"onCompleted") ;
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.i(TAG,"onError:"+e.getMessage());
                }
    
                @Override
                public void onNext(String s) {
                    Log.i(TAG,"onNext:"+s);
                }
            }) ;

    2、from

    //from 也可以创建Observable  讲int类型的数组01234转化为Observable,通过订阅的onNext可以一个个的取到数组的值
            Integer[] arr = {0,1,2,3,4};
            //完成创建Observable
            Observable<Integer> from = Observable.from(arr);
            //完成订阅
            from.subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG,"onCompleted") ;
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.i(TAG,"onError:"+e.getMessage());
                }
    
                @Override
                public void onNext(Integer i) {
                    Log.i(TAG,"onNext:"+i);
                }
            }) ;

    3、just

    //just  也可以创建Observable  参数是可变参数
            Observable.just(0, 1, 2, 3, 4, 5)
                    .subscribe(new Action1<Integer>() {
                        @Override
                        public void call(Integer integer) {
                            Log.i(TAG,"call:"+integer);
                        }
                    }) ;

    4、map

    //map 变换,在该实例中,将Integer转换成String
    //在实际开发中,需要通过String类型的url获取到图片
    
            String[] urls = {};
            Observable.from(urls)
                    .map(new Func1<String, Bitmap>() { //第一个参数为传入的类型,第二个参数为返回的类型
                        @Override
                        public Bitmap call(String s) {
                            //s 代表图片url,网络请求通过url 获取到图片
                            return null;
                        }
                    }).subscribe(new Action1<Bitmap>() { // 获取的的Bitmap类型再进行订阅处理
                @Override
                public void call(Bitmap bitmap) {
                    //iv.setBackage()
                }
            });
    
            /*Observable.just(0,1,2,3)
                    .map(new Func1<Integer, String>() {
                        @Override
                        public String call(Integer integer) {
                            return integer+"转换了";
                        }
                    }).subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.i(TAG,"call:"+s);//0转换了  1转换了。。。
                }
            });*/

    5、flatMap

    //flatmap 转换  将多个Observable转换成一个Observalbe然后发送
            //获取城市的天气
    
            /**
             *
             * map 是将一种类型转换成另一种类型(可以是任意类型)
             *
             * flatmap 是将一种类转换成Observable(泛型可以是任意的)
             *
             */
    
            String[] citys = {"北京","上海","杭州"};
            Observable.from(citys)
                    .flatMap(new Func1<String, Observable<WeathData>>() {
                        @Override
                        public Observable<WeathData> call(String s) {
                            return getCityWeathData(s);
                        }
                    }).subscribe(new Action1<WeathData>() {
                @Override
                public void call(WeathData weathData) {
                    Log.i(TAG,weathData.city+weathData.state);
                }
            });

    此处用到的getCityWeathData方法返回出来一个泛型为WeathData的Observable:

    /**
         * 获取一个城市的天气数据
         * @param city
         * @return
         */
        private Observable<WeathData> getCityWeathData(final String city){
            return Observable.just(city)
                    .map(new Func1<String, WeathData>() {
                        @Override
                        public WeathData call(String s) {
                            //通过网络请求获取城市的天气数据
                            WeathData weathData = new WeathData();
                            weathData.city = city ;
                            weathData.state = "晴天" ;
                            return weathData ;
                        }
                    });
        }

    6、zip

    //zip  将两个Observable按照规则严格的合成一个Observable
            Observable<Integer> observable1 = Observable.just(10, 20, 30,40);
            Observable<Integer> observable2 = Observable.just(1, 2, 3,4);
    
            Observable.zip(observable1, observable2, new Func2<Integer, Integer, String>() {
                @Override
                public String call(Integer integer, Integer integer2) {
                    //定义合并规则
                    return integer + integer2 + "abc";
                }
            }).subscribe(new Action1<String>() {
                @Override
                public void call(String string) {
                    Log.i(TAG,"call:"+string) ;
                }
            });

    7、zipWith

    //zipwith 将本身与其他的Observable按照规则严格的合并成一个Observable
            Observable.just(10,20,30,40)
                    .zipWith(Observable.just("a", "b", "c"), new Func2<Integer, String, String>() {
                        @Override
                        public String call(Integer integer, String s) {
                            //合并规则
                            return integer + s ;
                        }
                    }).subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.i(TAG,"call:"+s) ;
                }
            });

    8、retry

    //retry 在出错的时候重试(异常的时候重新执行)
            //用处:网络连接异常的时候
            Observable.create(new Observable.OnSubscribe<Integer>() {
                @Override
                public void call(Subscriber<? super Integer> subscriber) {
                    try {
                        for (int i = 0; i < 5; i++) {
                            if (i == 3) {
                                throw new Exception("出错了");
                            }
                            subscriber.onNext(i);
                        }
                        subscriber.onCompleted();
                    }catch (Exception e){
                        subscriber.onError(e);
                    }
                }
            }).retry(2).subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG,"onCompleted");
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.i(TAG,"onError:"+e.getMessage()) ;
                }
    
                @Override
                public void onNext(Integer integer) {
                    Log.i(TAG,"onNext:"+integer) ;
                }
            });

    9、retryWhen

    //retrywhen 异常的时候执行
            //网络请求框架中,一般使用retryWhen  要执行操作是连接网络,连接出异常的时候,
            // 1、我们可以直接重复执行连接网络,retry
            // 2、同时我们也可以判断连接异常的类型,再做决定是否重连 retyrWhen
            Observable.create(new Observable.OnSubscribe<Integer>() {
                @Override
                public void call(Subscriber<? super Integer> subscriber) {
                    Log.i(TAG,"总出错");
                    subscriber.onError(new Throwable("出错了"));
                }
            }).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
                @Override
                public Observable<?> call(Observable<? extends Throwable> observable) {
                    return observable.zipWith(Observable.range(1, 3), new Func2<Throwable, Integer, Integer>() {
                        @Override
                        public Integer call(Throwable throwable, Integer integer) {
                            return integer;
                        }
                    }).flatMap(new Func1<Integer, Observable<?>>() {
                        @Override
                        public Observable<?> call(Integer integer) {
                            //timer 延迟执行的操作符
                            Log.i(TAG,"延迟"+integer+"秒");
                            return Observable.timer(integer, TimeUnit.SECONDS);
                        }
                    });
                }
            }).subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG,"onCompleted");
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.i(TAG,"onError:"+e.getMessage()) ;
                }
    
                @Override
                public void onNext(Integer integer) {
                    Log.i(TAG,"onNext:"+integer) ;
                }
            }) ;

    10、filter

    //filter 按照规则过滤
            Observable.just(0,1,2,3,4,5)
                    .filter(new Func1<Integer, Boolean>() {
                        @Override
                        public Boolean call(Integer integer) {
                            return integer < 2;
                        }
                    }).subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.i(TAG,"call:"+integer) ;
                }
            });

    。。。

  • 相关阅读:
    <%!%>和<%%>的区别
    <jsp:param>传参乱码问题
    RedHat6.4 安装yum源
    J2EE中getParameter与getAttribute以及对应的EL表达式
    Ubuntu xrdp 遠端桌面連線 a
    Ubuntu SSH server 快速安裝和設定 a
    Ubuntu 12.04 快速安裝 Scrapy a
    Linux 壓縮與解壓縮指令備忘錄 a
    vim 設定快捷鍵為 [Ctrl] + [s] 存檔 a
    Linux 常用指令備忘錄 a
  • 原文地址:https://www.cnblogs.com/happy-warmth/p/10506638.html
Copyright © 2011-2022 走看看