RxJava 嵌套调用接口

    我的标题写的很清楚是嵌套调用接口。比如你需求是要调用两个接口,只允许两个接口同时成功,只有一个成功就不算成功而不去更新UI,否则只有一个成功去更新UI会出现“bug”的感觉。所以你要嵌套来调用者两个接口,就是在第一个接口成功的基础上去调用第二个接口,在第二个接口成功的前提下才去更新UI。(暂时先不讨论你的需求规定那个接口调用必须在前面的问题,后面会直接说的)


  用RxJava操作符flatMap就可以直接解决,不是merge。我先讲一下merge会是什么样的效果。


  1、merge:

代码如下,我特地在test1里面加了一个延时,因为你用merge去调接口的时候你肯定不能保证那个接口先调用完毕,我这里假定第一个接口(test1)耗时长一些,如果你这样写的话,log会先打印22再打印111。我这样写可能有人就反驳,你给第一个加了延时他肯定是后打印啊。呵呵,我说的很清楚,你在merge同时调用两个接口的时候,你不能保证那个接口先调用完毕,我这里模拟的情况是第一个接口网速比较差,我想表达的意思是使用merge的时候,不能达到嵌套的效果,他会那个接口先调用完毕就先走到subscribe里面去。

Observable<String> test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("22");
        Observable.merge(test1, test2)
                .subscribe(o -> {
                    Log.e(TAG, o.toString());
                }, e -> {
                });
 2、flatMap:

  你嵌套调用接口无非是两种原因(场景):

(1)拿着第一个接口的返回值作为第二个接口的入参使用。

(2)等两个接口都调用成功的前提下去搭配使用两个接口返回的数据。


(1)上面的场景一:

 Observable<String> test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable.just(1)
                .flatMap(new Function<Integer, Observable<String>>() {
                    @Override
                    public Observable<String> apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function<String, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(String s) throws Exception {
                        return Observable.just(s+"22");
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.e(TAG, o.toString());
                    }
                });
(2)上面的场景二:

Observable<String> test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable<String> test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function<Integer, Observable<String>>() {
                    @Override
                    public Observable<String> apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function<String, Observable<String>>() {
                    @Override
                    public Observable<String> apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                });

3、用flatMap嵌套调用接口如果某一个接口出错了,会直接终结调,不往下走,如下我用5/0,会直接走到trhowable


Observable<String> test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable<String> test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function<Integer, Observable<String>>() {
                    @Override
                    public Observable<String> apply(Integer integer) throws Exception {
                        int s = 5 / 0;
                        return test1;
                    }
                })
                .flatMap(new Function<String, Observable<String>>() {
                    @Override
                    public Observable<String> apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                }, throwable -> Log.e(TAG, "出错啦:" + throwable.getMessage()));





  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值