RxJava 初探

2016-04-12  本文已影响336人  Sunny_An

前言

去年无意间知道了RxJava这个东东,但一直没时间去看看。最近,终于有了不少时间,经过两周的学习,对RxJava有了初步的认识。下面我会记录一些个人认为比较重要的知识,以备以后查看(并没有深层的原理解析,仅仅在应用层面上)。

个人对RxJava的理解

RxJava是一个对数据流和事件流操作的库,它是对数据的一种链式操作,在操作过程中,可以方便的进行数据加工,线程切换,从而避免了复杂的嵌套,缩进,提高代码的可读性,可维护性。

RxJava的使用

  1. 简单的例子
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(20);
            }
        }).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer integer) {
                return integer.toString();
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                System.out.println(s);
            }
        });

Observable.create()可以用来创建一个被观察者,Observable.OnSubscribe中有被订阅时执行的操作。
这时可以使用操作符对得到的Observable进行一些变换。比如map(),对单一的数据流进行变换操作,如将Integer转为String类型。每进行一次变换,就得到了一个新的Observable
最后,使用subscribe()方法,对其进行订阅操作。其中Subscriber为订阅者。

  1. 常用的创建操作符
        Observable.just(1, 2, 3)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer);
                    }
                });
        Integer[] numbers = new Integer[]{1, 2, 3};
        Observable.from(numbers)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer);
                    }
                });
  1. 线程控制
    在不指定线程时,RxJava遵循线程不变原则,在哪个线程中执行subscribe(),就在哪个线程产生事件,消费事件。如需切换线程,需要用到Schedules(调度器)。
        Integer[] numbers = new Integer[]{1, 2, 3};
        Observable.from(numbers)
                .subscribeOn(Schedulers.io())
                .doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        System.out.println("toast  " + Thread.currentThread().getName());
                        Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_SHORT).show();
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())  //①
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer + "  " + Thread.currentThread().getName());
                    }
                });

如没有①处的subscribeOn(AndroidSchedulers.mainThread())doOnSubscribe将在当前执行subscribe()的线程中运行。
- observeOn() 指定Subscriber所运行在的线程,或者叫做事件消费的线程。这里的Subscriber可以是变换以后的,换句话说,observeOn()指定的是它之后的操作所在的线程。因此如果有多次切换线程的需求,只要在每个想要切换线程的位置调用一次observeOn()即可。

        Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.newThread())
                .map(mapOperator) // 新线程,由 observeOn() 指定
                .observeOn(Schedulers.io())
                .map(mapOperator2) // IO 线程,由 observeOn() 指定
                .observeOn(AndroidSchedulers.mainThread)
                .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定
圈起来的的方法所在的工作线程,受相应颜色的线程控制操作符影响

说明

这篇笔记是在看完 扔物线 大大的 给 Android 开发者的 RxJava 详解 一文后的笔记,并引用了文章里的部分代码和图片,仅供个人学习,还请大大不要责怪(●'◡'●)。这也是我写的第一篇文章,好开心,以后会坚持下去的。在水平提高后,也会努力写一些原创文章,与大家共同进步~

上一篇下一篇

猜你喜欢

热点阅读