把RxJava拆解成上游和下游。也就是起点和终点。
事件起源 n ---------------(上游)
(下游) ---------------》1 事件处理
1. 事件流动不可逆。
2.上游可以发n个事件到下游的唯一观察者。
3. 在下游可切断上游,这样上游事件就不再发到下游了
下面的代码探讨上下游个方法事件执行的顺序。
private Disposable d;
/**
* @param view
*/
public void onClick(View view) {
//上游 Observable 被观察者
Observable.create(new ObservableOnSubscribe<String>() {
//emitter发射器
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Log.d(TAG, "上游subscribe: 开始发射。。。");
emitter.onNext("RxJavaStudy");//上游一发出,下游马上就会接到。同时上游会在这里等待下游执行完成onNext
emitter.onComplete();//上游发出发射完成的事件,下游就会马上接到并且执行onComplete。同时也要在上游等待下游执行完成。
//上游的最后log才会打印
Log.d(TAG, "上游subscribe: 发射完成"); //等下游都执行完成了,上游才会执行完毕。
}
}).subscribe(
//下游 Observer 观察者
new Observer<String>() {
//只要一订阅成功就会最先执行。
@Override
public void onSubscribe(Disposable d) {
//这儿使用的例子如: 弹出 加载框 .... 然后在onCompleted里关闭弹出框
Log.d(TAG, "上游和下游订阅成功 onSubscribe 1");
MainActivity.this.d = d;
}
@Override
public void onNext(String s) {
Log.d(TAG, "下游接收 onNext:" + s); //等待上游发射onNext
}
@Override
public void onError(Throwable e) { //等待上游发射onError
}
@Override
public void onComplete() { //等待上游发射onComplete
//关闭弹出框
Log.d(TAG, "下游接收完成");
}
});
}
//切断上下游,之后下游就接受不到上游发出的事件了。
@override
public void onDestroy(){
if(d!=null) d.dispose()
}
输出顺序:
上游和下游订阅成功 onSubscribe 1.
上游subscribe: 开始发射。。。
下游接收 onNext:
下游接收完成
上游subscribe: 发射完成
主要是了解执行顺序,以及切断上下游,注释有解释。
还有三个测试后的结论,在实际开发的时候需要十分注意:
1. 在上游onComplete()/onError 发射完成之后再发射事件,下游不再接收上游的事件
2. 已经发射了onError(),再发射onComplete(),RxJava会报错误,这种方式是不允许的。
3. 先发射了onError(),再发射onComplete(),不会报错,有问题时(onComplete不会接收到了)。