* 接口二
* 获取热词
* @return
*/
@GET("hotkey/json")
Observable<BaseResponse<List<HotKeyResp.DataBean>>> getHotKey();
}
#### 1、多任务嵌套回调
场景:比如调用接口一有回调后才能调用接口二,如果接口一调用失败不再调用接口二。下面是二种写法。
写法一,代码如下:
//为了看清楚代码,没有使用lambda简化
//接口一
Observable<BaseResponse> articleList = ApiManager.getInstance().getApiService().getArticleList();
//接口二
Observable<BaseResponse<List<HotKeyResp.DataBean>>> hotKey = ApiManager.getInstance().getApiService().getHotKey();
Observable.just(articleList)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<Observable<BaseResponse>, Observable<BaseResponse<List<HotKeyResp.DataBean>>>>() {
@Override
public Observable<BaseResponse<List<HotKeyResp.DataBean>>> apply(Observable<BaseResponse> baseResponseObservable) throws Throwable {
//处理第一个请求返回的数据
if(baseResponseObservable!=null) mTv.setText(baseResponseObservable.blockingSingle().toString());
return hotKey; //发起第二次网络请求
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Observable<BaseResponse<List<HotKeyResp.DataBean>>>>() {
@Override
public void accept(Observable<BaseResponse<List<HotKeyResp.DataBean>>> baseResponseObservable) throws Throwable {
//处理第二次网络请求的结果
if(baseResponseObservable!=null) mTvTwo.setText(baseResponseObservable.blockingSingle().toString());
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Throwable {
//异常的处理:比如Dialog的Dismiss,缺省页展示等
//注意:如果第一个网络请求异常,整个事件会中断,不会执行第二个网络请求,如果多个请求同理
//但是请求成功的还是能正常处理
LogUtil.e(throwable.toString());
}
});
写法二,代码如下:
//为了看清楚代码,没有使用lambda简化
//接口一
Observable<BaseResponse> articleList = ApiManager.getInstance().getApiService().getArticleList();
//接口二
Observable<BaseResponse<List<HotKeyResp.DataBean>>> hotKey = ApiManager.getInstance().getApiService().getHotKey();
//请求第一个
articleList.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<BaseResponse>() {
@Override
public void accept(BaseResponse articleListRespBaseResponse) throws Throwable {
//处理第一个网络请求的结果
if(articleListRespBaseResponse!=null) mTv.setText(articleListRespBaseResponse.toString());
}
}).observeOn(Schedulers.io())
.flatMap(new Function<BaseResponse, ObservableSource<BaseResponse<List<HotKeyResp.DataBean>>>>() {
@Override
publ