RxJava(三)merge操作符
2016-08-29 本文已影响2943人
请你吃鱼
在平时开发时,一个页面不免会同时请求多个接口的数据,如果用一般的网络请求框架,我们得写多块代码来进行请求,那有没有办法只写一块代码就能够请求多个接口的数据呢?答案当然是可以的,本篇文章我们就来介绍一下RxJava合并操作符merge的用法。这里先贴出需要的接口:
public interface ApiManger {
@GET("/app/user/levellist")
Call<String> grade(@QueryMap Map<String, String> map);
@GET("/app/evaluation/getcity")
Call<CityBean> getCity();
}
现在假设我们需要在一个页面中同时请求两个接口来获取学生所在城市和班级,如果我们只用Retrofit的话大概需要这样写:
ApiManger apiManger = RetrofitHelper.getManger();
apiManger.getCity().enqueue(new Callback<CityBean>() {
@Override
public void onResponse(Call<CityBean> call, Response<CityBean> response) {
}
@Override
public void onFailure(Call<CityBean> call, Throwable t) {
}
});
apiManger.grade(new HashMap<>()).enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
那如果用上RxJava会是什么样呢,这里的merge操作符中便是请求的两个参数,Observable.merge(apiManger.grade(new HashMap<>()), apiManger.getCity()),前面我们讲过,RxJava传递的是一个对象,但是现在有两条流水线,最后合并在一块会变成个什么东西呢,这里就用到了Java的多态了,我们可以用一个Object来表示,最后的结果就像这样:
ApiManger apiManger = RetrofitHelper.getManger();
Observable.merge(apiManger.grade(new HashMap<>()), apiManger.getCity())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
}
@Override
public void onNext(Object o) {
if (o instanceof CityBean) {
Logger.e(((CityBean) o).getMsg());
} else {
Logger.json(o.toString());
}
}
});
这里我们用instanceof来判断一下o到底是什么类型的实例,最后我们看一下打印出来的结果:
两个接口中的数据都是没问题的,但是RxJava一旦遇到错误就会终止,我们把前面的接口故意改成错误的看一下结果:
虽然只有第一个数据流是错误的,但是整个请求却结束了,这可不是我们想要的,那应该怎么办呢?好在RxJava提供了mergeDelayError操作符,顾名思义,这个操作符的作用就是延迟错误,我们继续看一下结果:
可以看到产生的错误并没有中断后面的数据。
ok,本篇文章到此结束。