RetroHttp(五) — 并发请求

2021-01-21  本文已影响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,今天的内容就介绍到这里了,谢谢大家。

上一篇 下一篇

猜你喜欢

热点阅读