RxJava是什么、优点
RxJava (本文所有RxJava全都代指RxJava2)在 GitHub 主页上的自我介绍是:RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
核心就是一个基于事件的异步的程序库!
好处就是解决原生异步回调,造成的代码冗长、可读性可维护性差的问题,将其以一种链式的平铺的写法呈现,更方便维护!(有点类似前端Promise的作用)
依赖
可以去RxJava github官网直接copy最新版
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
观察者与被观察者
简单的说, 被观察者用于发送事件,观察者用于接收事件,两者建立订阅关系后,就可以实现,被观察者在需要的时候发送事件来通知观察者!
关于观察者模式不用过于纠结,只需简单的理解,被观察者属于上游事件来源,用来发送事件,观察者属于下游,用于接收事件就ok了!
RxJava中有两种观察者模式:
前者不支持背压(Backpressure),后者支持!
背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略。官方对于背压的解释
来一个例子
/*
RxJava 的三部曲:
初始化 Observable(被观察者 事件来源)
初始化 Observer(观察者 事件接收)
建立订阅关系(将两者建立联系 被观察者可以通过发射事件通知观察者)
*/
private void testRxJava1() {
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
//发射事件
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
Log.e("TAG", "emitter on...");
emitter.onComplete();
Log.e("TAG", "emitter complete and on...");
emitter.onNext(4);
}
});
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
//Disposable可以做到切断的操作,让Observer观察者不再接收上游事件
Log.d("TAG", "subscribe");
}
@Override
public void onNext(Integer integer) {
Log.d("TAG", "integer = " + integer);
}
@Override
public void onError(Throwable e) {
Log.d("TAG", "onError");
}
@Override
public void onComplete() {
Log.d("TAG", "onComplete");
}
};
observable.subscribe(consumer);//建立订阅关系
}
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: subscribe
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: integer = 1
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: integer = 2
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: integer = 3
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: emitter on...
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: onComplete
05-19 11:50:57.050 2321-2321/com.example.rxjava.rxjavademo E/TAG: emitter complete and on...
从上面的结果可以看出,事件发射执行的一些顺序,规则!如被观察者调用emitter.onComplete();
之后,虽然下面的事件继续发射,但是观察者并没有接收!
ObservableEmitter 事件发射器 它可以通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)分别发出next事件、complete事件和error事件,它有以下几点需要注意的地方:
Disposable,可以通过调用他的dispose()方法,让下游观察者无法继续接收事件!
//将上面那个例子链起来 就是RxJava经典写法链式操作
private void testRxJava1() {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
Log.e("TAG", "emitter on...");
emitter.onComplete();
Log.e("TAG", "emitter complete and on...");
emitter.onNext(4);
}
}).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.d("TAG", "subscribe");
}
@Override
public void onNext(Integer integer) {
Log.d("TAG", "integer = " + integer);
}
@Override
public void onError(Throwable e) {
Log.d("TAG", "onError");
}
@Override
public void onComplete() {
Log.d("TAG", "onComplete");
}
});
}
另外, subscribe()有多个重载的方法:
public final Disposable subscribe() {}
public final Disposable subscribe(Consumer super T> onNext) {}
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError) {}
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError, Action onComplete) {}
public final Disposable subscribe(Consumer super T> onNext, Consumer super Throwable> onError, Action onComplete, Consumer super Disposable> onSubscribe) {}
public final void subscribe(Observer super T> observer) {}
带有一个Consumer参数的subscribe:
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
Log.e("TAG", "emmiter 1");
emitter.onNext(1);
Log.e("TAG", "emmiter 2");
emitter.onNext(2);
Log.e("TAG", "emmiter 3");
emitter.onNext(3);
emitter.onComplete();
Log.e("TAG", "emmiter 4");
emitter.onNext(4);
Log.e("TAG", "emmiter 5");
emitter.onNext(5);
}
}).subscribe(new Consumer<Integer>() {//只处理onNext
@Override
public void accept(Integer integer) throws Exception {
Log.e("TAG", "accept integer = " + integer);
}
});
上面这个例子,可以用java8的箭头函数,进一步简化:
Observable.create((ObservableOnSubscribe) emitter -> {
Log.e("TAG", "emmiter 1");
emitter.onNext(1);
Log.e("TAG", "emmiter 2");
emitter.onNext(2);
Log.e("TAG", "emmiter 3");
emitter.onNext(3);
emitter.onComplete();
Log.e("TAG", "emmiter 4");
emitter.onNext(4);
Log.e("TAG", "emmiter 5");
emitter.onNext(5);
}).subscribe(integer -> Log.e("TAG", "accept integer = " + integer));
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: emmiter 1
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: accept integer = 1
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: emmiter 2
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: accept integer = 2
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: emmiter 3
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: accept integer = 3
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: emmiter 4
05-19 15:25:11.290 7170-7170/com.example.rxjava.rxjavademo E/TAG: emmiter 5
带有两个参数的subscribe() :
Observable.just(1, "2")
.cast(Integer.class)//将被观察者发送的事件数据类型强转为Integer
.subscribe(new Consumer() {//只处理onNext
@Override
public void accept(Integer integer) throws Exception {
Log.e("TAG", "" + integer);
}
}, new Consumer() {//捕获异常
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("TAG", throwable.getMessage());
}
});
当然它也可以用java8的箭头函数改写:
Observable.just(1, "2")
.cast(Integer.class)
.subscribe(integer -> Log.e("TAG", "" + integer),
throwable -> Log.e("TAG", throwable.getMessage()));
运行结果
05-22 15:15:54.405 6034-6034/com.example.rxjava.rxjavademo E/TAG: 1
05-22 15:15:54.405 6034-6034/com.example.rxjava.rxjavademo E/TAG: java.lang.String cannot be cast to java.lang.Integer
这里只是对基本概念的介绍,对RxJava有一个基本了解,后续会进行详细的用法解读!
RxJava2.x学习教程(二)常用操作符
参考
RxJava Github官网
给 Android 开发者的 RxJava 详解 (RxJava1时代的神作)
给初学者的RxJava2.0教程系列
这可能是最好的RxJava 2.x 教程系列
RxJava常见的使用场景总结