美文网首页
RetroHttp(五) — 并发请求

RetroHttp(五) — 并发请求

作者: 奔跑的佩恩 | 来源:发表于2021-01-21 08:34 被阅读0次

    前言

    RetroHttp作为一个基于Retrofit2.x网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的文章里,我已经对RetroHttp的使用做了些相关介绍,大家感兴趣的话可以参考以下文章:
    RetroHttp(一) — 下载使用介绍
    RetroHttp(二) — 下载支持增量更新
    RetroHttp(三) — kotlin版网络请求
    RetroHttp(四) — 实现串联请求

    在开发中有时回遇到极端情景,那就是要在同意时间向服务器发起多个请求,也就是我们常说的并发请求。那么今天就让我们来学习下RetroHttp中关于并发请求的知识吧。

    今天涉及知识内容:

    1. 并发请求
    2. RetroHttp中支持并发请求的方法
    3. ObservableHelper 之并发请求的使用
    4. 需要注意的问题

    一. 并发请求

    并发请求就是在某一时间向服务器同时发起多个网络请求。

    二. RetroHttp中支持并发请求的方法

    之前讲过ObservableHelper是支持串联请求的。其实ObservableHelper中也有支持并发请求的方法,该方法如下:

        /***
         * 同时发起多个通讯的Observable(并发通讯)
         *
         * @param length
         * @param listener
         * @return
         */
        public static Observable getObservableByArray(int length, OnObservableListener listener)
    

    三.ObservableHelper 之并发请求的使用

    以下贴出ObservableHelperPresenter中发起并发通讯的核心代码(示例):

    /**
     * Title:登录功能通讯逻辑层
     * description:
     * autor:pei
     * created on 2019/12/16
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    public class TempPresenter implements TempContract.Presenter{
    
        private Context mContext;
        private TempContract.View mView;
        private int mCount; //声明一个变量用于统计并发完成个数
    
        public TempPresenter(Context context, PreView view) {
            this.mContext = context;
            this.mView = (TempContract.View) view;
        }
    
        @Override
        public void attachView() {//可以用来注册RxBus
    
        }
    
        @Override
        public void detachView() {//可以用来注销RxBus
    
        }
    
        @Override
        public void checkVersion() {
            String names[]=new String[]{"name1","name2"};
            mCount=names.length;
            //开始做并发请求
            ApiService apiService = (ApiService) ApiRetrofitor.getInstance().getBaseRetrofitor().getApiService();
            Observable observable=ObservableHelper.getObservableByArray(mCount, new OnObservableListener() {
                @Override
                public Observable getObservable(int index) {
                    //加密数据
                    RequestUser user = new RequestUser();
                    user.setUsername(names[index]);
                    user.setPassword("xxxxxxx"); //假设两个账号的密码一样
                    return apiService.login(user);
                }
            });
    
            //加载loading
            LoadingDialog.getInstance().showLoading(mContext);
            //处理最后一次通讯的结果
            RxManager.connect(observable, new ApiObserver<ResponseData>() {
                @Override
                public void doNext(ResponseData responseData) {
                    mCount--;
                    if(mCount==0){//最后一次才关闭loading
                        LoadingDialog.getInstance().hideLoading();
                    }
    
                    int code = responseData.getCode();
                    String message = responseData.getMessage();
                    if (code == ResponseCode.SUCCES_CODE) {//成功
                        Object object = responseData.getData();
                        if (object != null) {
                            String temp = GsonUtil.gsonString(object);
                            User user = GsonUtil.gsonToBean(temp, User.class);
                            mView.loginSuccess(user);
                        } else {
                            mView.loginFail("获取信息为空");
                        }
                    } else {
                        mView.loginFail(message);
                    }
                }
    
                @Override
                public void doError(ServerException e) {
                    mCount--;
                    if(mCount==0) {//最后一次才关闭loading
                        LoadingDialog.getInstance().hideLoading();
                    }
                    LogUtil.i("=====error=====" + e.getMessage());
                    mView.loginFail("发生错误");
                }
            });
        }
    }
    

    四.需要注意的问题

    这里需要注意的是,由于并发请求涉及到多个请求,需要统计网络请求个数以便做业务逻辑商的操作,所以在开始之前要声明一个全局变量:

    private int mCount; //声明一个变量用于统计并发完成个数
    

    然后在发起并发通讯之前要给她赋值:

           mCount=names.length;
    

    接下来就是在RxManager.connect(...)doNext(ResponseData responseData)doError(ServerException e)中对mCount进行计数,然后根据实际业务需求确定是否要对某一情景做具体操作,如:

    • 第一次发起请求
    • 所有请求
    • 最后一次请求

    等。具实际情况操作。

    ok,今天的内容就介绍到这里了,谢谢大家。

    相关文章

      网友评论

          本文标题:RetroHttp(五) — 并发请求

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