RxJava操作符Merge--解决单个页面多个请求情况

5,102 阅读2分钟

1. 写在前面

我们在开发过程中经常会碰到一个页面需要请求多个接口然后刷新界面数据,当然做这种需求的解决方式有很多,但是都不是很好 比如

  • 后台更改接口,所有数据做成一个接口

后台系统一般来说比较成熟,而且开发进度在前端前面,一般不会为了前端做出很大的改变,并且需求是一只加,谁也不清楚,一个界面需要的数据到底需要多少,包括后台

  • 一个接口接着一个请求,请求成功或者失败做其他接口的请求

这样子当然可以,但是逻辑上就复杂了并且以后的维护非常麻烦,比如 A B C三个接口,在A请求成功后请求B,B请求成功后请求C,这样的嵌套请求非常不优雅

  • 当然也可以三个并排请求

什么也不管比如一进入页面三个ABC接口都放在初始方法中,但是这样有些风险,因为接口请求都是异步的,谁也琢磨不到三个接口的先后顺序,万一 前面接口的成功与否关系到后面接口就会报错,并且如果需求是有先后顺序的请求呢?所以这种是最不推荐的,但是也是平常非常不容易忽略的

2. 解决

我这边使用的是RxJava解决的,解决的方式一般有人使用zip,也有人使用merge,到底使用哪个操作符?我试了下 貌似两个都没问题,查了很多资料 发现这位博主分析的非常详细 blog.csdn.net/jdsjlzx/art…
这里我使用的是merge 有三个接口,先看这merge使用代码

 Observable<Object> merge = Observable.merge(mModel.getStationInfo(mView.getStationParams()),mModel.getAlarmMsg(mView.getAlarmParams()),mModel.getChartDayData(mView.getRequestParams()));

Observable.merge(A,B,C) 其中A,B,C分别是Observable<>,也就是每个接口的被观察者,这里每个人写RxJava的方式不一样,我这里是rxjava+retrofit+mvp,所以写出来就是如上,注意如果你也是用mvp,那么这些代码一般来说是 写在p层的,用一个方法包含起来,直接请求三个接口的方法,使用直接使用即可。 所有代码如下

    @Override
    public void subMergeData() {
        Observable<Object> merge = Observable.merge(mModel.getStationInfo(mView.getStationParams()),mModel.getAlarmMsg(mView.getAlarmParams()),mModel.getChartDayData(mView.getRequestParams()));
        mRxManage.add(merge.subscribe(new RxSubscriber<Object>(mContext) {
            @Override
            public void onStart() {
                mView.showLoading(mContext.getString(R.string.loading));
            }

            @Override
            protected void _onNext(Object o) {
                if(o instanceof StationInfoBean){
                    mView.returnStationInfo((StationInfoBean) o);
                }else if(o instanceof AlarmMsgBean){
                    mView.returnAlarmMsg((AlarmMsgBean) o);
                }else if(o instanceof ChangeChartDayBean){
                    mView.returnDayInfo((ChangeChartDayBean) o);
                }
            }

            @Override
            protected void _onError(String message) {

            }
        }));
    }