最近工作中,需要在okgo的基础上做网络请求的链式调用,然后就查看了一些资料捣鼓了一下。
1.添加的依赖库
compile 'com.lzy.net:okgo:3.0.4'
compile 'com.lzy.net:okrx2:2.0.2'
2.因为OkGo 3.+版本支持Rxjava2 ,所以使用Rxjava2的flatmap操作符就能完成链式调用的
需求。首先做第一次请求,代码如下:
OkGo.<String>post("http://route.showapi.com/9-9")
.params("area","北京")
.converter(new StringConvert())
.adapt(new ObservableResponse<String>())
.subscribeOn(Schedulers.io())
.flatMap(new Function<Response<String>, ObservableSource<Response<String>>>() {
@Override
public ObservableSource<Response<String>> apply(Response<String> stringResponse) throws Exception {
return null
}
})
这样在flatMap中拿到第一个请求的回调数据 Response<String>。
一般链式调用的场景是第一个请求的返回数据来做第二个请求的参数。flatMap 中我们可以把拿到的数据处理一下,
然后做第二次请求,并返回一个Observable,如下:
OkGo.<String>post("http://route.showapi.com/9-9")
.params("area","北京")
.converter(new StringConvert())
.adapt(new ObservableResponse<String>())
.subscribeOn(Schedulers.io())
.flatMap(new Function<Response<String>, ObservableSource<Response<String>>>() {
@Override
public ObservableSource<Response<String>> apply(Response<String> stringResponse) throws Exception {
JsonFormat.printJson("第一次请求数据:",stringResponse.body(),"***");
//假装使用第一个请求返回的数据
io.reactivex.Observable<Response<String>> observable = OkGo.<String>post("http://route.showapi.com/9-9")
.params("area", "上海")
.converter(new StringConvert())
.adapt(new ObservableResponse<String>())
.subscribeOn(Schedulers.io());
return observable;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ApiObserver<Response<String>>(this) {
@Override
public void onSuccess(Response<String> apiResult) {
JsonFormat.printJson("第二次请求数据:",apiResult.body(),"***");
}
@Override
public void onFailed(Throwable e) {
}
});
这样其实两次请求的链式调用已经完成,在 Observer的 回调中处理第二次回调的结果就可以了。文中的ApiObserver 是我对Observer的扩展。执行这段代码,Log日志如下:
数据太长,其实可以看到是顺序执行的。
如果想要进行多次的链式调用,则在flatMap继续使用flatMap来处理回调,就可以N到N+1的继续,不过最后需要subscribe来结尾。
除了flatMap,类似concatMap也可以有这样的效果,不过concatMap是保证从第一个请求到第二个请求的有序性,如果
第一个发射器(Observable)多次发射数据,concatMap可以按照顺序做第二步的请求,flatMap则是无序的。
更多相关的操作符可以自行搜集Rxjava2相关的资料学习。