RxJava入门

来源:互联网 发布:日本旅游注意事项知乎 编辑:程序博客网 时间:2024/06/15 08:06

什么是 ReactiveX?

ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

实时数据处理是一件普通的现象,有一个高效、干净和可扩展的方式来处理这些情景是重要的。使用 Observables 和 Operators 来熟练操作它们。ReactiveX 提供一个可组合又灵活的 API 来创建和处理数据流,同时简化了异步编程带来的一些担忧,如:线程创建和并发问题。

RxJava 简介

RxJava 是 ReactiveX 在 Java 上的开源的实现。Observable(观察者) 和 Subscriber(订阅者)是两个主要的类。在 RxJava 上,一个 Observable 是一个发出数据流或者事件的类,Subscriber 是一个对这些发出的 items (数据流或者事件)进行处理(采取行动)的类。一个 Observable 的标准流发出一个或多个 item,然后成功完成或者出错。一个 Observable 可以有多个 Subscribers,并且通过 Observable 发出的每一个 item,该 item 将会被发送到 Subscriber.onNext() 方法来进行处理。一旦 Observable 不再发出 items,它将会调用 Subscriber.onCompleted() 方法,或如果有一个出错的话 Observable 会调用 Subscriber.onError() 方法。

现在,我们知道了很多关于 Observable 和 Subscriber 类,我们可以继续去介绍有关 Observables 的创建和订阅。

Observable integerObservable = Observable.create(new Observable.OnSubscribe() {   @Override   public void call(Subscriber subscriber) {       subscriber.onNext(1);       subscriber.onNext(2);       subscriber.onNext(3);       subscriber.onCompleted();   }});

这个 Observable 发出了整数 1,2,3 然后结束了。现在我们需要创建一个 Subscriber,那样我们就能让这些发出的流起作用。

Subscriber integerSubscriber = new Subscriber() {   @Override   public void onCompleted() {       System.out.println("Complete!");   }   @Override   public void onError(Throwable e) {   }   @Override   public void onNext(Integer value) {       System.out.println("onNext: " + value);   }};

我们的 Subscriber 只是简单的把任何发出的 items 打印出来,完成之后通知我们。一旦你有一个 Observable 和一个 Subscriber,可以通过 Observable.subscribe() 方法将他们联系起来。

integerObservable.subscribe(integerSubscriber);// Outputs:// onNext: 1// onNext: 2// onNext: 3// Complete!

上面所有这些代码可以简单的通过使用 Observable.just() 方法来创建一个 Observable 去发出这些定义的值,并且我们的 Subscriber 可以改变成匿名的内部类,如下:

Observable.just(1, 2 ,3).subscribe(new Subscriber() {   @Override   public void onCompleted() {       System.out.println("Complete!");   }   @Override   public void onError(Throwable e) {}   @Override   public void onNext(Integer value) {       System.out.println("onNext: " + value);   }});

操作符

创建和订阅一个 Observable 是足够简单的,可能这并不是非常有用的,但这只是用 RxJava 的一个开始。通过调用操作符,任何的 Observable 都能进行输出转变,多个 Operators 能链接到 Observable 上。例如,在我们刚才的 Observable 中,我们只想要收到奇数的数字。要做到这一点,我可以使用 filter() 操作符。

Observable.just(1, 2, 3, 4, 5, 6) // add more numbers       .filter(new Func1() {           @Override           public Boolean call(Integer value) {               return value % 2 == 1;           }       })       .subscribe(new Subscriber() {           @Override           public void onCompleted() {               System.out.println("Complete!");           }           @Override           public void onError(Throwable e) {           }           @Override           public void onNext(Integer value) {               System.out.println("onNext: " + value);           }       });// Outputs:// onNext: 1// onNext: 3// onNext: 5// Complete!

我们的 filter() 操作符定义了一个方法,将取出我们发出的整数,并对所有的奇数返回为 true,所有的偶数返回为 false。从我们的 filter() 返回为 false 的值是不会发出到 Subscriber 的,我们也不会在输出中看到他们。注意:filter() 操作符返回的是一个 Observable,这样我们的订阅方式就可以像之前的做法那样了。

现在,我想找到发出的这些奇数的平方根,一种方法是在调用我们的 Subscriber 的每一个 onNext() 去计算平方根。然而,如果我们在我们的 Subscriber 中做计算平方根的操作的话,这样得到期望可能就不能进一步实现的数据的流式转换了。要做到这一点,我们可以在 filter() 操作符上链上 map() 操作符。

Observable.just(1, 2, 3, 4, 5, 6) // add more numbers       .filter(new Func1() {           @Override           public Boolean call(Integer value) {               return value % 2 == 1;           }       })       .map(new Func1() {           @Override           public Double call(Integer value) {               return Math.sqrt(value);           }       })       .subscribe(new Subscriber() { // notice Subscriber type changed to            @Override           public void onCompleted() {               System.out.println("Complete!");           }           @Override           public void onError(Throwable e) {           }           @Override           public void onNext(Double value) {               System.out.println("onNext: " + value);           }       });// Outputs:// onNext: 1.0// onNext: 1.7320508075688772// onNext: 2.23606797749979// Complete!

操作符的链式使用是构成 RxJava 必不可少的一部分,让你可以灵活的实现任何你想要的需求。