RxJava系列(二)上游和下游

把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不会接收到了)

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值