虽然一直都有在用RxJava2,但是很惭愧的是,一直都只是在和Retrofit配合使用的时候用了一下,总感觉自己确实还不怎么理解RxJava2。看着RxJava中各种各样的操作符,有点力不从心的感觉。可耻地连代码都看不懂的话,实在说不过去哈。
下面进入正题
使用RxJava2,需要先配置build.gradle:
这是目前最新的版本
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
RxJava的核心就是观察者模式:被观察者、观察者、订阅关系
借用一位博主的话来说,将被观察者比喻为上游(Observable),观察者为下游(Observer),嘻嘻
下面看一下代码:
1.创建一个上游(Obervable):
//创建一个上游
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
Log.d("----", "subscribe: 上游发送事件:1");
e.onNext(1);
Log.d("----", "subscribe: 上游发送事件:1");
e.onNext(2);
Log.d("----", "subscribe: 上游发送事件:1");
e.onNext(3);
Log.d("----", "subscribe: 上游结束发送");
e.onComplete();
}
});
ObservableEmitter:是事件发射器的意思。
2.创建一个下游(Observer):
//创建一个下游
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.d("----", "onSubscribe: 下游订阅");
}
@Override
public void onNext(Integer integer) {
Log.d("----", "onNext: 下游接收事件:"+integer);
}
@Override
public void onError(Throwable e) {
Log.d("----", "onError: 下游报错:"+e);
}
@Override
public void onComplete() {
Log.d("----", "onComplete: 下游接收完了事件");
}
};
我们可以看到打印出来的内容是:
02-02 16:32:13.809 12913-12913/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:32:13.809 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:2
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:3
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onComplete: 下游接收完了事件
从上面的Log日志我们可以看出,首先调用的是下游的订阅方法,接着上游开始发送事件,上游发送一个,下游就接收一个,当上游说我要结束发送事件了,下游也就关闭了事件的接收。
接着我们再看一个例子:
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
Log.d("----", "subscribe: 上游发送:1");
e.onNext(1);
Log.d("----", "subscribe: 上游发送:2");
e.onNext(2);
Log.d("----", "subscribe: 上游发送:3");
e.onNext(3);
Log.d("----", "subscribe: 上游结束发送事件:complete");
e.onComplete();
}
}).subscribe(new Observer() {
private int i;
private Disposable disposable;
@Override
public void onSubscribe(Disposable d) {
Log.d("----", "onSubscribe: 下游订阅");
disposable = d;
}
@Override
public void onNext(Integer integer) {
Log.d("----", "onNext: "+integer);
i++;
if(i == 2){
Log.d("----", "onNext: disposable");
disposable.dispose();
}
}
@Override
public void onError(Throwable e) {
Log.d("----", "onError: 下游报错"+e);
}
@Override
public void onComplete() {
Log.d("----", "onComplete: 下游结束接收");
}
});
这个例子的意思是上游总共发送三个事件,而下游接收到两个事件后,就将连接断开,测试是否还能接收到上游的事件
下面看一下Log:
02-02 16:42:13.266 14571-14571/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:42:13.266 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:1
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: 1
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:2
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: 2
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: disposable
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:3
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送事件:complete
可以从Log中看出来,当下游切断连接之后,上游继续发送的事件,下游就接收不到了。
再看一个例子:
//2
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
Log.d("----", "subscribe: 上游发送:1");
e.onNext(1);
Log.d("----", "subscribe: 上游发送:2");
e.onNext(2);
Log.d("----", "subscribe: 上游发送:3");
e.onNext(3);
Log.d("----", "subscribe: 上游结束发送事件:complete");
e.onComplete();
Log.d("----", "subscribe: 上游发送:4");
e.onNext(4);
}
}).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.d("----", "onSubscribe: 下游订阅");
}
@Override
public void onNext(Integer integer) {
Log.d("----", "onNext:下游接收到的事件: "+integer);
}
@Override
public void onError(Throwable e) {
Log.d("----", "onError: 下游报错"+e);
}
@Override
public void onComplete() {
Log.d("----", "onComplete: 下游结束接收");
}
});
上游先发送三个事件,然后告诉下游我发送完毕了,结果又发送了一个事件给下游,看下游是否会接收。
看一下Log输出:
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:1
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 1
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:2
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 2
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:3
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 3
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送事件:complete
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onComplete: 下游结束接收
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:4
Log显示,当下游结束接收后,上游再发送的事件,下游是接收不到的!
结尾总结:
1.上游可以发送无限个onNext, 下游也可以接收无限个onNext.
2.当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件
3.当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
4.上游可以不发送onComplete或onError.
5.最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError,
也不能先发一个onComplete, 然后再发一个onError, 反之亦然