RXAndroid的简单介绍

2019-01-21  本文已影响0人  红茶炒饭

首先RxJava 需要在 JDK1.8+ 的版本 运行

 implementation 'io.reactivex:rxandroid:1.2.1'
 implementation 'io.reactivex:rxjava:1.3.8'

subscribeOn():

Schedulers.immediate() 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler
Schedulers.newThread() 总是启用新线程,并在新线程执行操作
Schedulers.io() I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
Schedulers.computation() 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
AndroidSchedulers.mainThread() 它指定的操作将在 Android 主线程运行。

RxAndroid 的基本使用
RxAndroidBase();

 /*-----------
     *🖐说明:
     *   RxAndroid 的基本使用
     */
    private void RxAndroidBase() {
        //创建被观察者
        Observable<String> stringObservable
                = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                //执行观察者的方法
                subscriber.onNext("姜开元");
            }
        });

        //创建观察者
        //该方法在异常时,回调
        //一旦这个方法执行了!就代表观察者出了问题,所以onNext() 代码 不会执行了
        // 该方法在所有事件都观察完毕,回调,事件序列结束的标记
        //一旦这个方法执行了,就代表观察结束了,即使下面还有方法也不会执行了
        subscriber = new Subscriber<String>() {
            @Override
            public void onError(Throwable e) {
                Log.d("onNext", "测试该方法(失败了~)");
                //该方法在异常时,回调
                //一旦这个方法执行了!就代表观察者出了问题,所以onNext() 代码 不会执行了
            }
            @Override
            public void onNext(String s) {
                Log.d("onNext", s + "测试该方法(成功是回调)");
            }
            @Override
            public void onCompleted() {
                Log.d("onCompleted", "测试该方法,前面的方法都执行完毕了");
                // 该方法在所有事件都观察完毕,回调,事件序列结束的标记
                //一旦这个方法执行了,就代表观察结束了,即使下面还有方法也不会执行了

            }
        };

        //把观察者 注册到被观察者身上,只要这段代码中存在该代码 Call 方法就是立刻执行
        stringObservable.subscribe(subscriber);

    }

RxAndroid 接收一个集合对象 对其中的数据 进行 一个一个的观察
RxAndroidFrom()

  /*-----------
     *🖐说明:
     *   RxAndroid 接收一个集合对象 对其中的数据 进行 一个一个的观察
     */
    private void RxAndroidFrom() {
        //创建一个集合,并装上数据
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者
        Observable.from(integerList)
                //被观察者 一旦被创建 就指定了一个观察者 ,如此就不用再后面进行注册绑定了
                //如果用不到 onError,onCompleted 就创建这个方法 Action1
                //其中的call方法 就相当于 onNext
                //--from的对象 是什么类型的 Action1 就是什么类型的
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("call", integer + "");
                    }
                });
    }

接收一个集合对象,对整个集合进行操作
RxAndroidJust()

   /*-----------
     *🖐说明:
     *   接收一个集合对象,对整个集合进行操作
     */
    private void RxAndroidJust() {
        //创建一个集合 并且赋值
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者
        Observable.just(list)
                .subscribe(new Subscriber<List<Integer>>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(List<Integer> integers) {
                        Log.d("Call", integers + "");
                    }
                });
    }

RxAndroid 接收一个和对象,对其中的数据 进行 一个一个的过滤
RxAndroidFilterStream()

  /*-----------
     *🖐说明:
     *   RxAndroid 接收一个和对象,对其中的数据 进行 一个一个的过滤
     */
    private void RxAndroidFilterStream() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        //创建被观察者
        Observable.from(list)
                //对集合数据进行过滤,只发送符合条件的事件
                .filter(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        if (integer % 2 == 0) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("Call", "过滤后" + integer);
                    }
                });
   }

接收一个和对象,对其中的数据 进行转换
RxAndroidMapStream()

  /*-----------
     *🖐说明:
     *   接收一个和对象,对其中的数据 进行转换
     */
    private void RxAndroidMapStream() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者
        Observable.from(list)
                //对集合数据 进行转换
                //参数1:原数据类型
                //参数2:结果的数据类型
                //这个方法同样可以将 流 转换为Bitmap , 文件
                //String 字符串或数据库 转换为Bean类等
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer.toString();
                    }
                })
                //.map() 可以再次转换
                //由于 上边的 第二个类型是 String 所以 返回值变成了 String
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(String s) {
                        Log.d("成功", s);
                    }
                });
    }

把拿到的集合 进行拆分观察
RxAndroidFlatMap()

 /*-----------
    *🖐说明:
    *   把拿到的集合 进行拆分观察
    */
    private void RxAndroidFlatMap() {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(6, 7, 8, 9, 10);
        List<Integer> list3 = Arrays.asList(11, 12, 13, 14, 15);

        //TODO: just这个方法的 泛型可以指定多个 很多很多
        Observable.just(list1,list2,list3)
                .flatMap(new Func1<List<Integer>, Observable<?>>() {
                    //这个操作 减少了 1层for 循环
                    @Override
                    public Observable<?> call(List<Integer> integers) {
                        return Observable.from(integers);
                    }
                })
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        Log.d("成功",o+"");
                    }
                });

    }

销毁

  @Override
    protected void onStop() {
        super.onStop();
        //杀死这个对象 释放内存
        if(subscriber != null && !subscriber.isUnsubscribed()){
            subscriber.unsubscribe();
        }
    }

-----------------------------------

附加一个 JAVA8 环境搭建

在工作空间的build.gradle中配置

// Java8 环境的搭建,所使用的配置
repositories {
    mavenCentral()
}
// Java8 环境的搭建,所使用的配置
dependencies {
    classpath 'me.tatarka:gradle-retrolambda:3.3.1'
}
// Java8 环境的搭建,所使用的配置
allprojects {
    mavenCentral()
}
标注

在app/build.gradle中配置
(如果 报错 提示 你的插件之中 已存在 请将 apply plugin: 'me.tatarka.retrolambda' 删除即可)

// Java8 环境的搭建,所使用的配置
apply plugin: 'me.tatarka.retrolambda'



// Java8 环境的搭建,所使用的配置
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
标注
上一篇下一篇

猜你喜欢

热点阅读