合并多个网络请求rxjava

在项目中出现要获取用户的三个部分的信息,决定在登录后直接全部获取保存在本地。

在学习rxjava中,发现有多种实现方式。

刚开始采用zip:

flowable1,flowable2,flowable3分別为3个网络请求。

Flowable.zip(flowable1, flowable2, flowable3, new Function3<UserInfo, ShopInfo, UserProfile,
                LoginInfo>() {
    @Override
    public LoginInfo apply(UserInfo userInfo, ShopInfo shopInfo, UserProfile userProfile) throws Exception {
        LoginInfo loginInfo = new LoginInfo();
        loginInfo.profile = userProfile;
        loginInfo.user = userInfo;
        loginInfo.shop = shopInfo;
        return loginInfo;
    }
}).subscribeWith(new HttpResultSubscriber<LoginInfo>() {
    @Override
    public void onNext(LoginInfo loginInfo) {
        callBack.setInfo(loginInfo);//回调处理
    }

    @Override
    public void onError(Throwable t) {
        super.onError(t);
    }
});
由于三个请求是合并后同时发送,因此如果有一个请求事件出错,便进入到onError

即使有其他请求通过,也无法走到onNext


然而为了保存其中某些请求的数据,我们需要用另一种方式把每个事件都进行处理。

刚开始采用merge

Flowable.merge(flowable1, flowable2, flowable3)
       .subscribeWith(new HttpResultSubscriber<Object>() {
                          @Override
                          public void onNext(Object object) {
                              LoginInfo loginInfo = new LoginInfo();
                              if (object instanceof UserInfo) {
                                  loginInfo.user = (UserInfo) object;
                              }
                              if (object instanceof UserProfile) {
                                  loginInfo.profile = (UserProfile) object;
                              }
                              if (object instanceof ShopInfo) {
                                  loginInfo.shop = (ShopInfo) object;
                              }
                              callBack.setInfo(loginInfo);//回调处理

                          }
                      }
       );
但是发现retrofit的interceptor会报错,“ java.io.InterruptedIOException: thread interrupted”,目测是发送请求过快导致的。

查询资料发现merge是不按顺序发送事件,更换用顺序发送的concat之后没有出错。

Flowable.concat(flowable1, flowable2, flowable3)
       .subscribeWith(new HttpResultSubscriber<Object>() {
                          @Override
                          public void onNext(Object object) {
                              LoginInfo loginInfo = new LoginInfo();
                              if (object instanceof UserInfo) {
                                  loginInfo.user = (UserInfo) object;
                              }
                              if (object instanceof UserProfile) {
                                  loginInfo.profile = (UserProfile) object;
                              }
                              if (object instanceof ShopInfo) {
                                  loginInfo.shop = (ShopInfo) object;
                              }
                              callBack.setInfo(loginInfo);//回调处理

                          }
                      }
       );


当然,如果每个请求之间存在先后依赖,则可以使用map或flatMap操作符

例如flowable2和flowable3需要依赖flowable1的数据,则可以利用flatmap和zip结合

略显复杂。。

final Flowable<LoginInfo> flowable = Flowable.zip(flowable2, flowable3, new
        BiFunction<ShopInfo, UserProfile, LoginInfo>() {
            @Override
            public LoginInfo apply(ShopInfo shopInfo, UserProfile userProfile) throws Exception {
                LoginInfo loginInfo = new LoginInfo();
                loginInfo.profile = userProfile;
                loginInfo.shop = shopInfo;
                return loginInfo;//flowable2和3数据合并
            }
        });

flowable1.flatMap(new Function<UserInfo, Flowable<LoginInfo>>() {
    @Override
    public Flowable<LoginInfo> apply(UserInfo userInfo) throws Exception {
        LoginInfo loginInfo = new LoginInfo();
        loginInfo.user = userInfo;
        callBack.setInfo(loginInfo);//flowable1回调
        return flowable;
    }
}).subscribeWith(new HttpResultSubscriber<LoginInfo>() {
    @Override
    public void onNext(LoginInfo loginInfo) {
        callBack.setInfo(loginInfo);//flowable2和3数据合并后的回调
    }

    @Override
    public void onError(Throwable t) {
        super.onError(t);
    }
});


目测还可以利用compose,后面再补充。RxJava 着实很强大。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值