美文网首页
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(五) — 并发请求

    前言 RetroHttp作为一个基于Retrofit2.x网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的...

  • RetroHttp(四) — 实现串联请求

    前言 RetroHttp作为一个基于Retrofit2.x网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的...

  • RetroHttp(三) — kotlin版网络请求

    前言 RetroHttp作为一个基于Retrofit2.x网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的...

  • Axios请求并发限制

    标签 NodeJS并发请求,并行请求,QPS限制,Axios并发限制,Axios并发请求 背景 由于调用第三方服务...

  • 多线程GCD

    无序网络请求,异步+并发 有序网络请求,异步+并发(推荐) dispatch_semaphore_create:创...

  • AFNetworking并发请求管理

    AFNetworking并发请求管理GCD并发多个请求 有时候需要某些请求都结束了再进行某个操作, 而AFNetw...

  • 并发请求

    进程-线程-协程 简单描述 进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。进程拥有自己...

  • 并发请求

    待填坑

  • axios 的基本使用 以及请求拦截 响应拦截

    axios的基本使用 | axios发送并发请求 简单说一下什么是并发请求 就是当有 多个请求需要在全部完成之后 ...

  • axios的使用

    import get post 并发 其他请求

网友评论

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

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