RxJava

我的博客:http://wuxiaolong.me/2016/01/18/rxjava/

RxJava是什么

a library for composing asynchronous and event-based programs using observable sequences for the Java VM(一个对于构成使用的Java虚拟机观察序列异步和基于事件的程序库)。
github:https://github.com/ReactiveX/RxJava

观察者模式

RxJava的世界里,我们有四种角色:
Observable(被观察者)、Observer(观察者)
Subscriber(订阅者)、Subject
Observable和Subject是两个“生产”实体,Observer和Subscriber是两个“消费”实体。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

回调方法

Subscribe方法用于将观察者连接到Observable,你的观察者需要实现以下方法:

  • onNext(T item)
    Observable调用这个方法发射数据,方法的参数就是Observable发射的数据,这个方法可能会被调用多次,取决于你的实现。

  • onError(Exception ex)
    当Observable遇到错误或者无法返回期望的数据时会调用这个方法,这个调用会终止Observable,后续不会再调用onNext和onCompleted,onError方法的参数是抛出的异常。

  • onComplete
    正常终止,如果没有遇到错误,Observable在最后一次调用onNext之后调用此方法。

添加依赖

compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'

创建操作

create

 Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("RxJava");
                subscriber.onCompleted();
            }
        })
        .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.i("wxl", "onNext=" + s);
            }
        });

除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

 .subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                Log.i("wxl", "onNext=" + o);
            }
        });

from

接受数组,返回一个按参数列表顺序发射这些数据的Observable。

        String[] froms={"Hello","RxJava"};
        Observable.from(froms)
        .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.i("wxl", "onNext=" + s);
            }
        });

just

just函数,它接受一至九个参数,返回一个按参数列表顺序发射这些数据的Observable。

Observable.just("Hello","RxJava")
          .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.i("wxl", "onNext=" + s);
            }
        });

以上打印结果都是:

com.wuxiaolong.apksample I/wxl: onNext=Hello
com.wuxiaolong.apksample I/wxl: onNext=RxJava
com.wuxiaolong.apksample I/wxl: onCompleted

变换操作

Map

操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果。
如下,将原始Observable数据转化成大写,再发射:

 Observable.just("Hello", "RxJava")
                .map(new Func1() {
                    @Override
                    public String call(String s) {
                        return s.toUpperCase();
                    }
                })
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        Log.i("wxl", "onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i("wxl", "onNext=" + s);
                    }
                });

打印结果:

com.wuxiaolong.apksample I/wxl: onNext=HELLO
com.wuxiaolong.apksample I/wxl: onNext=RXJAVA
com.wuxiaolong.apksample I/wxl: onCompleted

flatMap

flatMap()接收一个Observable的输出作为输入,然后作为一个新的Observable再发射。理解flatMap的关键点在于,flatMap输出的新的Observable正是我们在Subscriber想要接收的,比如这里输出单个的字符串。

List list = new ArrayList<>();
        list.add("Hello");
        list.add("RxJava");
Observable.from(list)
                .flatMap(new Func1>() {
                    @Override
                    public Observable call(String s) {
                        return Observable.just(s.toUpperCase());
                    }
                })
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        Log.i("wxl", "onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i("wxl", "onNext=" + s);
                    }
                });

打印结果:

com.wuxiaolong.apksample I/wxl: onNext=HELLO
com.wuxiaolong.apksample I/wxl: onNext=RXJAVA
com.wuxiaolong.apksample I/wxl: onCompleted

Scan

一个累加器函数,操作符对原始Observable发射的第一项数据应用一个函数,然后将那个函数的结果作为自己的第一项数据发射。

 Observable.just(1, 2, 3, 4, 5)
         .scan(new Func2() {
             @Override
             public Integer call(Integer integer, Integer integer2) {
                 return integer + integer2;
             }
         })
         .subscribe(new Observer() {
             @Override
             public void onCompleted() {
                 Log.i("wxl", "onCompleted");
             }
             @Override
             public void onError(Throwable e) {
             }
             @Override
             public void onNext(Integer integer) {
                 Log.i("wxl", "onNext=" + integer);
             }
         });

第一次发射得到1,作为结果与2相加;发射得到3,作为结果与3相加,以此类推,打印结果:

 I/wxl: onNext=1
 I/wxl: onNext=3
 I/wxl: onNext=6
 I/wxl: onNext=10
 I/wxl: onNext=15
 I/wxl: onCompleted

GroupBy

按照指定的规则来分组元素。

过滤操作

Filter

观测序列中只有通过的数据才会被发射。

Observable.just(4, 2, 1, 7, 5)
        .filter(new Func1() {
            @Override
            public Boolean call(Integer integer) {
                return integer > 3;
            }
        })
        .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Integer integer) {
                Log.i("wxl", "onNext=" + integer);
            }
        });

过滤小于3的,打印结果:

I/wxl: onNext=4
I/wxl: onNext=7
I/wxl: onNext=5
I/wxl: onCompleted

take()、takeLast()

 .take(3)

只发射前N个元素

 .takeLast(3)

只发射最后N个元素

First、last

只发射第一个元素或者最后一个元素

Skip、SkipLast

.skip(2)

来创建一个不发射前两个元素而是发射它后面的那些数据的序列

distinct

仅处理一次,可以处理去除重复的数据

ElementAt

仅从一个序列中发射第n个元素然后就完成了,这里是从0开始计的。

Observable.just(1, 2, 3, 4, 5, 6)
                .elementAt(3)
                .subscribe(……);

打印结果:4

Sample

定期发射Observable最近发射的数据项

 .sample(1000, TimeUnit.MILLISECONDS)

合并操作

Merge

合并多个Observables的发射物,多输入,单输出

Observable observable1 = Observable.just(1, 3, 5);
Observable observable2 = Observable.just(2, 4, 6);
Observable.merge(observable1,observable2)
        .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Integer integer) {
                Log.i("wxl", "onNext=" + integer);
            }
        });

打印结果:

 I/wxl: onNext=1
 I/wxl: onNext=3
 I/wxl: onNext=5
 I/wxl: onNext=2
 I/wxl: onNext=4
 I/wxl: onNext=6
 I/wxl: onCompleted

zip

合并两个或者多个Observables发射出的数据项,根据指定的函数Func2变换它们,并发射一个新值。

Observable observable1 = Observable.just(1, 3, 5);
Observable observable2 = Observable.just(2, 4, 6, 9);
Observable.zip(observable1, observable2, new Func2
    @Override
    public Integer call(Integer integer, Integer integer2) {
        return integer + integer2;
    }
})
        .subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i("wxl", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Integer integer) {
                Log.i("wxl", "onNext=" + integer);
            }
        });

打印结果:

I/wxl: onNext=3
I/wxl: onNext=7
I/wxl: onNext=11
I/wxl: onCompleted

join

startWith

 .startWith(1)

在数据序列的开头插入一条指定的项1

Schedulers

调度器,解决Android主线程问题,有5种:

  • Schedulers.io()
    这个调度器时用于I/O操作(读写文件、读写数据库、网络信息交互等)

  • Schedulers.computation()
    这个是计算工作默认的调度器,它与I/O操作无关。它也是许多RxJava方法的默认调度器:buffer(),debounce(),delay(),interval(),sample(),skip()

  • Schedulers.immediate()
    这个调度器允许你立即在当前线程执行你指定的工作。它是timeout(),timeInterval(),以及timestamp()方法默认的调度器。

  • Schedulers.newThread()
    它为指定任务启动一个新的线程。

  • Schedulers.trampoline()
    当我们想在当前线程执行一个任务时,并不是立即,我们可以用.trampoline()将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。它是repeat()和retry()方法默认的调度器。

SubscribeOn、ObserveOn

subscribeOn():事件产生的线程
observeOn():事件消费的线程,AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程

完整示例

 Subscription subscription = Observable.just("Hello", "RxJava", "WuXiaolong")
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        Log.i("wxl", "onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i("wxl", "onNext=" + s);
                    }
                });
addSubscription(subscription);

addSubscription方法可以放到父类:

 private CompositeSubscription mCompositeSubscription;

    public void addSubscription(Subscription subscription) {
        if (this.mCompositeSubscription == null) {
            this.mCompositeSubscription = new CompositeSubscription();
        }

        this.mCompositeSubscription.add(subscription);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (this.mCompositeSubscription != null) {
            this.mCompositeSubscription.unsubscribe();
        }
    }

微信公众号

欢迎微信扫一扫关注:不止于技术分享,每天进步一点点。


RxJava_第1张图片

关于作者

点击查看

附录

RxJava Essentials CN
ReactiveX文档中文翻译
给 Android 开发者的 RxJava 详解

你可能感兴趣的:(RxJava)