Rxjava总结

Rxjava定义
基于事件流的链式调用,逻辑简洁,使用简单,功能强大的异步库

Rxjava描述
被观察者Observable在子线程中生产事件(耗时操作)
观察者Observer在主线程接收&响应事件(UI操作)

Rxjava原理(Observable.subscribe(observer))
被观察者通过订阅按顺序发送事件给观察者,观察者按顺序接收事件&作出对应的响应动作

Rxjava常见使用:
普通异步操作
retrofit+Rxjava网络请求
timer定时和interval周期性操作
throttleFirst按钮重复点击

Rxjava背压
在异步场景中,被观察者发送速度远快于观察者的处理速度,告诉被观察者降低发送速度的策略

Rxjava举例


  /*1,Observable快速创建和遍历*/

//            //快速创建被观察者对象(Observable) & 发送10个以下事件
//            Observable observable000 = Observable.just("A", "B", "C");
//            //快速创建被观察者对象(Observable) & 发送10个以上事件(数组形式)--数组遍历
//            String[] words = {"A", "B", "C"};
//            Observable observable001 = Observable.fromArray(words);
//            //快速创建被观察者对象(Observable) & 发送10个以上事件(集合形式)-集合遍历
//            List<String> list = new ArrayList<>();
//            list.add("A");
//            list.add("B");
//            list.add("C");
//            Observable observable002 = Observable.fromIterable(list);
//            //发送Complete事件,直接通知完成
//            Observable observable003 = Observable.empty();
//            //发送Error事件,直接通知异常
//            Observable observable004 = Observable.error(new RuntimeException());

            /*2,Observable事件变换--关联性*/

//            //完整创建1个被观察者对象
//            Observable observable00 = Observable.create((ObservableOnSubscribe<Integer>) emitter -> {
//                emitter.onNext(1);
//                emitter.onNext(2);
//                emitter.onNext(3);
//                emitter.onComplete();
//            }).map(new Function<Integer, String>() {//通过指定方法转换,比如int->string
//                @Override
//                public String apply(Integer integer) throws Exception {
//                    return "使用Map变换操作符将事件" + integer + "的参数从整型" + integer + "变换成字符串类型" + integer;
//                }
//            });
//
//            //flatMap无序的将被观察者发送的整个事件序列进行变换
//            Observable observable01 = Observable.create((ObservableOnSubscribe<Integer>) emitter -> {
//                emitter.onNext(1);
//                emitter.onNext(2);
//                emitter.onNext(3);
//            }).flatMap(new Function<Integer, ObservableSource<String>>() {
//                @Override
//                public ObservableSource<String> apply(Integer integer) throws Exception {
//                    final List<String> list = new ArrayList<>();
//                    for (int i = 0; i < 3; i++) {
//                        list.add("我是事件 " + integer + "拆分后的子事件" + i);
//                    }
//                    return Observable.fromIterable(list);
//                }
//            });
//
//            //concatMap有序的将被观察者发送的整个事件序列进行变换
//            Observable observable02 = Observable.create((ObservableOnSubscribe<Integer>) emitter -> {
//                emitter.onNext(1);
//                emitter.onNext(2);
//                emitter.onNext(3);
//            }).concatMap(new Function<Integer, ObservableSource<String>>() {
//                @Override
//                public ObservableSource<String> apply(Integer integer) throws Exception {
//                    final List<String> list = new ArrayList<>();
//                    for (int i = 0; i < 3; i++) {
//                        list.add("我是事件 " + integer + "拆分后的子事件" + i);
//                    }
//                    return Observable.fromIterable(list);
//                }
//            });

            /*3,多Observable串,并行执行--有序性*/

//            //组合多个被观察者,使用
//            //concatArray():组合多个被观察者一起发送数据(可>4个),串行执行
//            Observable observable11 = Observable.concatArray(
//                    Observable.just("1", "2", "3"),
//                    Observable.just("4", "5", "6"),
//                    Observable.just("7", "8", "9"),
//                    Observable.just("10", "11", "12"),
//                    Observable.just("13", "14", "15"));
//            //mergeArray():组合多个被观察者一起发送数据(可>4个),并行执行
//            Observable observable12 = Observable.mergeArray(
//                    Observable.just("1", "2", "3"),
//                    Observable.just("4", "5", "6"),
//                    Observable.just("7", "8", "9"),
//                    Observable.just("10", "11", "12"),
//                    Observable.just("13", "14", "15"));
//            //concatArrayDelayError() / mergeArrayDelayError(),其中任意一个Observable出现异常,都会继续执行其他Observable
//            Observable observable13 = Observable.mergeArrayDelayError(
//                    Observable.just("1", "2", "3"),
//                    Observable.create(new ObservableOnSubscribe<String>() {
//                        @Override
//                        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
//                            emitter.onNext("4");
//                            emitter.onError(new NullPointerException());
//                            emitter.onNext("5");
//                            emitter.onNext("6");
//                            emitter.onComplete();
//                        }
//                    }),
//                    Observable.just("7", "8", "9"),
//                    Observable.just("10", "11", "12"),
//                    Observable.just("13", "14", "15"));

            /*4,合并Observable,组合数据源*/

//            //通过zip合并多个Observable发送的事件,生成一个新的事件序列(即组合过后的事件序列),并最终发送--1对1合并,按个数合并,combineLatest是按时间合并
//            Observable observable14 = Observable.zip(
//                    Observable.just("1", "2", "3"),
//                    Observable.just("A", "B", "C"), new BiFunction<String, String, String>() {
//                        @NotNull
//                        @Override
//                        public String apply(@NotNull String s1, @NotNull String s2) throws Exception {
//                            return s1 + "_" + s2;
//                        }
//                    });
//
//            //startWithArray发送事件前追加发送事件
//            Observable observable15 = Observable.just("4", "5", "6").startWithArray("1", "2", "3");

            /*5,延迟,重发*/

//            //delay延迟发送
//            Observable observable16 = Observable.just("1", "2", "3").delay(2, TimeUnit.SECONDS);
//
//            //出现异常后重复请求
//            Observable observable17 = Observable.create(new ObservableOnSubscribe<String>() {
//                @Override
//                public void subscribe(ObservableEmitter<String> e) throws Exception {
//                    e.onNext("1");
//                    e.onNext("2");
//                    e.onError(new Exception("发生错误了"));
//                    e.onNext("3");
//                }
//            }).retry(2);
//
//            //repeat,无条件重复请求
//            Observable observable18 = Observable.just("1", "2", "3").repeat(3);

            /*6,线程调度,订阅,取消订阅*/

//            //subscribe()使得被观察者&观察者形成订阅关系
//            observable18
//                    //多次指定Observable的线程,则只有第一次指定有效
//                    .subscribeOn(Schedulers.io())
//                    //多次指定Observer的线程,则每次指定均有效
//                    .observeOn(AndroidSchedulers.mainThread())
//                    .subscribe(new Observer<String>() {
//                        private Disposable mDisposable;
//
//                        @Override
//                        public void onSubscribe(Disposable d) {
//                            mDisposable = d;
//                            Log.d(TAG, "开始采用subscribe连接");
//                        }
//
//                        @Override
//                        public void onNext(String value) {
//                            if (value.equals("B")) {
//                                //切断链接
//                                mDisposable.dispose();
//                                Log.d(TAG, "已经切断了连接:" + mDisposable.isDisposed());
//                            }
//                            Log.d(TAG, "对Next事件" + value + "作出响应");
//                        }
//
//                        @Override
//                        public void onError(Throwable e) {
//                            Log.d(TAG, "对Error事件作出响应");
//                        }
//
//                        @Override
//                        public void onComplete() {
//                            Log.d(TAG, "对Complete事件作出响应");
//                        }
//                    });

            //简洁观察者写法
//            observable002.subscribe(new Consumer<String>() {
//                @Override
//                public void accept(String s) throws Exception {
//                    Log.d(TAG, s);
//                }
//            });

//常规异步操作
CompositeDisposable mCompositeDisposable = new CompositeDisposable()
 Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                //该部分执行耗时操作,并将结果result通过onNext传输
                emitter.onNext(result);
                emitter.onComplete();
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                      mCompositeDisposable.add(d);
                    }

                    @Override
                    public void onNext(String str) {
                        mTvBa.setText(str);
                    }

                    @Override
                    public void onError(Throwable e) {
                        mTvBa.setText("error");
                    }

                    @Override
                    public void onComplete() {
                        mTvBa.setText("complete");
                    }
                });
                
mCompositeDisposable.clear();

Rxjava案例
1, 案例1,login的结果给rainCountToMap参数,rainCountToMap的结果给newAllWaterLevel参数–关联性


            ApiService mApiService = Api.getDefault(HostType.BASE_URL);
            mApiService.login(body)
                    .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.io())
                    .concatMap(new Function<UserData, Observable<SSYLBean>>() {
                        @Override
                        public Observable<SSYLBean> apply(@NotNull UserData userData) throws Exception {
                            //login的参数给rainCountToMap
                            return mApiService.rainCountToMap(userData.getToken);
                        }
                    })
                    .observeOn(Schedulers.io())
                    .concatMap(new Function<SSYLBean, Observable<JXYWBean>>() {
                        @Override
                        public Observable<JXYWBean> apply(@NotNull SSYLBean s) throws Exception {
                            //rainCountToMap的参数给newAllWaterLevel
                            return mApiService.newAllWaterLevel(s.getRainId);
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new RxSubscriber<JXYWBean>(this, "登录中...", true) {
                        @Override
                        protected void _onNext(JXYWBean t) {

                        }

                        @Override
                        protected void _onError(String message) {
                        }
                    });
                    

2,案例2,串,并行混合执行–顺序性(mergeArray/concatArray)


            ApiService mApiService = Api.getDefault(HostType.BASE_URL);
            Observable<UserData> userDataObservable = mApiService.login(body);
            Observable<SSYLBean> ssylBeanObservable = mApiService.rainCountToMap();
            Observable<JXYWBean> jxywBeanObservable = mApiService.newAllWaterLevel();
            Observable observable = Observable.mergeArray(
                    Observable.concatArray(userDataObservable, ssylBeanObservable),
                    jxywBeanObservable);

            observable
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new RxSubscriber<T>(this, "登录中...", true) {
                        @Override
                        protected void _onNext(T t) {
                            if (t instanceof UserData) {
                                i("adfsafds", "UserData");
                            } else if (t instanceof SSYLBean) {
                                i("adfsafds", "SSYLBean");
                            } else if (t instanceof JXYWBean) {
                                i("adfsafds", "JXYWBean");
                            }
                        }

                        @Override
                        protected void _onError(String message) {
                        }
                    });
                    

3,案例3,合并login和rainCountToMap请求结果数据源—合并(zip)


            ApiService mApiService = Api.getDefault(HostType.BASE_URL);
            Observable<UserData> userDataObservable = mApiService.login(body);
            Observable<SSYLBean> ssylBeanObservable = mApiService.rainCountToMap();
            Observable<String> observable = Observable.zip(
                    userDataObservable,
                    ssylBeanObservable, new BiFunction<UserData, SSYLBean, String>() {
                        @NotNull
                        @Override
                        public String apply(@NotNull UserData userData, @NotNull SSYLBean ssylBean) throws Exception {
                            return userData.getData().getUser().getSName() + "_" + ssylBean.getData().get(0).getDate();
                        }
                    });
            observable
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new RxSubscriber<String>(this, "登录中...", true) {
                        @Override
                        protected void _onNext(String str) {
                            i("adfsafds", str);
                        }

                        @Override
                        protected void _onError(String msg) {
                        }
                    });
                    

4,案例4,融合关联(变换concatMap),顺序(组合mergeArray),合并(zip)


 //login提供参数给newAllWaterLevel(concatMap),rainCountToMap和newAllWaterLevel并行执行(mergeArray),再合并rainCountToMap和waterLeverToMap(zip)
            Api.getDefault(HostType.BASE_URL)
                    .login(body)
                    .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.io())
                    .concatMap(new Function<UserData, Observable<T>>() {
                        @Override
                        public Observable<T> apply(@NotNull UserData userData) throws Exception {
                            return (Observable<T>) Observable.zip(
                                    (Observable<T>) Observable.mergeArray(
                                            Api.getDefault(HostType.BASE_URL).rainCountToMap(),
                                            Api.getDefault(HostType.BASE_URL).newAllWaterLevel(userData.getToken())),
                                    Api.getDefault(HostType.BASE_URL).waterLeverToMap(), new BiFunction<T, SSSWBean, String>() {
                                        @NotNull
                                        @Override
                                        public String apply(@NotNull T t, @NotNull SSSWBean ssswBean) throws Exception {
                                            return ((SSYLBean) t).getData().get(0).getDate() + "_" + ssswBean.getData().get(0).getSenid();
                                        }
                                    });
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new RxSubscriber<T>(this, "加载中...", true) {
                        @Override
                        protected void _onNext(T str) {
                            i("OkHttp", str + "");
                        }

                        @Override
                        protected void _onError(String message) {
                        }
                    });
                    

本文结束,只是参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值