Rxjava中使用zip合并数据源

       我们在应用开发的时候。往往会遇到这种情况:一个页面会有不同的数据源,这些数据源有的还来自不同的服务器,我们渲染页面的时候都想等数据请求完成,在统一渲染页面,但不同数据源的接口响应时间是不同的,怎么完美的解决这个问题呢?今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:合并数据源需求 ,并结合Retrofit 与RxJava 实现,希望大家会喜欢。

即,同时向4个数据源获取数据 -> 合并数据 -> 统一展示到客户端

此处采用Merge() & Zip()操作符进行讲解,其中:

Merge()例子 :实现较为简单的从(网络 + 本地)获取数据 & 统一展示

Zip()例子:结合Retrofit 与RxJava,实现较为复杂的合并2个网络请求向2个服务器获取数据 & 统一展示

我这里结合项目重点说明永Zip命令怎么合并数据源。结合保险详情页面四个接口的数据合并

一、首先创建4个被观察者:

public Flowable getUserList(String template) {

return homeService.getUserList(template)

.map(new Function, HomeUserCardListBean>() {

                @Override

public HomeUserCardListBean apply(QSCResponse response) throws Exception {

if (response.code != AppConstants.HTTP_CODE) {

throw new QSCExplicitException(response);

                    }

return response.data;

                }

})

.onErrorResumeNext(new Function>() {

                @Override

public Publisher apply(Throwable throwable) throws Exception {

return QSCExceptionUtil.getNetworkError(new QSCExplicitException("获取用户配置信息数据失败", QSCExplicitException.CODE_UNKNOWN_ERROR));

                }

})

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io());

}

public Flowable getCardList(String template) {

return homeService.getCardList(template)

.map(new Function, HomeCardListBean>() {

                @Override

public HomeCardListBean apply(QSCResponse response) throws Exception {

if (response.code != AppConstants.HTTP_CODE) {

throw new QSCExplicitException(response);

                    }

return response.data;

                }

})

.onErrorResumeNext(new Function>() {

                @Override

public Publisher apply(Throwable throwable) throws Exception {

return QSCExceptionUtil.getNetworkError(new QSCExplicitException("获取身份列表数据失败", QSCExplicitException.CODE_UNKNOWN_ERROR));

                }

})

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io());

}

public Flowable getPriceList(String template) {

return homeService.getPriceList(template)

.map(new Function, HomePriceListBean>() {

                @Override

public HomePriceListBean apply(QSCResponse response) throws Exception {

if (response.code != AppConstants.HTTP_CODE) {

throw new QSCExplicitException(response);

                    }

return response.data;

                }

})

.onErrorResumeNext(new Function>() {

                @Override

public Publisher apply(Throwable throwable) throws Exception {

return QSCExceptionUtil.getNetworkError(new QSCExplicitException("获取价格列表数据失败", QSCExplicitException.CODE_UNKNOWN_ERROR));

                }

})

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io());

}

public Flowable getInsurancedPosition(String template) {

return homeService.getInsurancedPosition(template)

.map(new Function, HomeInsurancedPeopleCard.HomeInsurancedPeople>() {

                @Override

public HomeInsurancedPeopleCard.HomeInsurancedPeople apply(QSCResponse response) throws Exception {

if (response.code != AppConstants.HTTP_CODE) {

throw new QSCExplicitException(response);

                    }

return response.data;

                }

})

.onErrorResumeNext(new Function>() {

                @Override

public Publisher apply(Throwable throwable) throws Exception {

return QSCExceptionUtil.getNetworkError(new QSCExplicitException("获取保单详情数据失败", QSCExplicitException.CODE_UNKNOWN_ERROR));

                }

})

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io());

}

二、合并数据源

  //合并数据源

disposableRecharge = Flowable.zip(getUserList(template), getCardList(template), getPriceList(template), getInsurancedPosition(template), new Function4<HomeUserCardListBean, HomeCardListBean, HomePriceListBean, HomeInsurancedPeopleCard.HomeInsurancedPeople, HomeInsurancedPeopleCard>() {

        @Override

public HomeInsurancedPeopleCard apply(HomeUserCardListBean homeUserCardListBean, HomeCardListBean homeCardListBean, HomePriceListBean homePriceListBean, HomeInsurancedPeopleCard.HomeInsurancedPeople homeInsurancedPeopleCard) throws Exception {

            //

HomeInsurancedPeopleCard insurancedPeopleCard = new HomeInsurancedPeopleCard(template);

            //

insurancedPeopleCard.homeUserCardListBean = homeUserCardListBean;

insurancedPeopleCard.homeCardListBean = homeCardListBean;

insurancedPeopleCard.homePriceListBean = homePriceListBean;

insurancedPeopleCard.homeInsurancedPeople = homeInsurancedPeopleCard;

            //

return insurancedPeopleCard;

        }

}).subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.onErrorResumeNext(new Function>() {

                @Override

public Publisher apply(Throwable throwable) throws Exception {

return QSCExceptionUtil.getNetworkError(new QSCExplicitException("获取投保详情页面数据失败", QSCExplicitException.CODE_UNKNOWN_ERROR));

                }

}).subscribe(new Consumer() {

                //

                @Override

public void accept(HomeInsurancedPeopleCard homeInsurancedPeopleDataCard) throws Exception {

host.tv_username.setText(homeInsurancedPeopleDataCard.homePriceListBean.title);

                    //

host.clearCardAdapter();

host.addCard(homeInsurancedPeopleDataCard);

                    //alert

host.hideAnimation();

host.onCompleteRefresh();

                }

}, new Consumer() {

                @Override

public void accept(Throwable throwable) throws Exception {

host.netError(QSCExceptionUtil.getNetErrorCode(throwable));

host.onCompleteRefresh();

disposables.offer(disposableData);

                }

})

 ;

disposables.offer(disposableData);

}

合并数据源的时候根据具体需求可以切换不同线程,看数据请求是同步获异步,observeOn(AndroidSchedulers.mainThread())这是主线程,subscribeOn(Schedulers.io())子线程,两者相同是同步、不同是异步

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 先创建服务端的APP 1.官网下载Winrun4j。http://winrun4j.sourceforge.net...
    Alex_1799阅读 1,847评论 1 2
  • 2018.3.31 星期六 多云 天还没亮,我们就开始忙了,看着熟睡的宝贝,真不忍心把他叫醒,最...
    宁宁_1372阅读 286评论 0 0
  • 姓名:刘敬武 公司:临沂和创饲料有限公司 【反省总结第58天,始于20180420今天是20180616】 【知~...
    0dbb66a89a27阅读 182评论 0 0