今天回顾下RxJava2的基本流程
步骤一:引入RxJava和RxAndroid
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
步骤二:RxJava是基于观察者模式,需要创建一个被观察者,一个观察者对象,分别对应着RxJava中的Observable和Observer。
//被观察者,发送事件
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//发送一个事件
emitter.onNext(1);
//发送完成,但是仅仅是告诉下游不再接受上游的发送事件,上游还可以继续发送事件
emitter.onComplete();
//发送Error,与onComplete类似,两者互斥,只能发送两者中的一个
emitter.onError(new NullPointerException());
}
});
//观察者,接受被观察者发送的事件
Observer<Integer> observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
//Disposable用于控制上下游事件的阀门,在Activity生命周期结束时,应该调用disposable.dispose()
disposable = d;
}
@Override
public void onNext(Integer integer) {
//onNext用于接收上游发送的事件
if(integer>2){
disposable.dispose();
}
}
@Override
public void onError(Throwable e) {
//接收上游发送的error
}
@Override
public void onComplete() {
//接收上游发送的complete通知
}
};
//两者通过subscribe进行订阅
observable.subscribe(observer);//默认Observable与Observer在同一线程;
注意: 只有当上游和下游建立连接之后, 上游才会开始发送事件. 也就是调用了subscribe() 方法之后才开始发送事件.
ObservableEmitter: Emitter是发射器的意思,那就很好猜了,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件。
但是,请注意,并不意味着你可以随意乱七八糟发射事件,需要满足一定的规则:
-
上游可以发送无限个onNext, 下游也可以接收无限个onNext.
-
当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
-
当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
-
上游可以不发送onComplete或onError.
-
最为关键的是onComplete和onError必须唯一并且互斥, 不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然。
Disposable:用于控制上下游事件的阀门,在Activity生命周期结束时,应该调用disposable.dispose()。
-
在
Observer
的onSubs
cribe
回调中,会传入一个Disposable
对象,下游可以通过该对象的dispose()
方法主动切断和上游的联系,在这之后上游的observableEmitter.isDisposed()
方法将返回true
。 -
当上游和下游的联系切断之后,下游收不到包括
onComplete/onError
在内的任何事件,若此时上游再调用onError
方法发送事件,那么将会报错。
注意:
-
关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制,如果你的代码逻辑中违背了这个规则, 并不一定会导致程序崩溃。
-
比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了,
-
但若是发送多个onError,则收到第二个onError事件会导致程序会崩溃。
-
调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.