我的标题写的很清楚是嵌套调用接口。比如你需求是要调用两个接口,只允许两个接口同时成功,只有一个成功就不算成功而不去更新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>>() {@Overridepublic Observable<String> apply(Integer integer) throws Exception {return test1;}}).flatMap(new Function<String, ObservableSource<?>>() {@Overridepublic ObservableSource<?> apply(String s) throws Exception {return Observable.just(s+"22");}}).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() {@Overridepublic 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>>() {@Overridepublic Observable<String> apply(Integer integer) throws Exception {return test1;}}).flatMap(new Function<String, Observable<String>>() {@Overridepublic Observable<String> apply(String s) throws Exception {result1 = s;return test2;}}).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {@Overridepublic 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>>() {@Overridepublic Observable<String> apply(Integer integer) throws Exception {int s = 5 / 0;return test1;}}).flatMap(new Function<String, Observable<String>>() {@Overridepublic Observable<String> apply(String s) throws Exception {result1 = s;return test2;}}).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {@Overridepublic void accept(String result2) throws Exception {Log.e(TAG, result1 + result2);}}, throwable -> Log.e(TAG, "出错啦:" + throwable.getMessage()));