RxJava(三)merge操作符

作者: 请你吃鱼 | 来源:发表于2016-08-29 17:40 被阅读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,本篇文章到此结束。

相关文章

网友评论

  • 键盘上的麒麟臂:我有个Observable列表,每个Observable只发送一个请求,merge的结果会按照发生的顺序吗
  • MapleShao:需求是请求多个,结果统一处理,对于错误的直接过滤,我开发中故意写错一个,但是mergeDelayError不走onCompleted咋回事?
  • 爬着的蜗牛:这个merge和concat那个操作符有什么区别呢?
    MapleShao:需求是请求多个,结果统一处理,对于错误的直接过滤,我开发中故意写错一个,但是mergeDelayError不走onCompleted咋回事?
    爬着的蜗牛:嗯!是的
    Lauren_Liuling:merge组合的多个Observable在不同线程并发发射时,收到的数据可能会交错,而concat则无论怎样都不会交错,都是按顺序接收。
  • 斑马搬码:merge和mergeDelayError操作符不会走onCompleted回调方法吗?
    请你吃鱼:@七方 我试了一下会走的,你是不是其中一个请求发生了错误呢?
    斑马搬码:@七方 为什么log不出日志?
    请你吃鱼: @七方 会走吧

本文标题:RxJava(三)merge操作符

本文链接:https://www.haomeiwen.com/subject/yqgxettx.html