前言
RetroHttp
作为一个基于Retrofit2.x
网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的文章里,我已经对RetroHttp
的使用做了些相关介绍,大家感兴趣的话可以参考以下文章:
RetroHttp(一) — 下载使用介绍
RetroHttp(二) — 下载支持增量更新
RetroHttp(三) — kotlin版网络请求
RetroHttp(四) — 实现串联请求
在开发中有时回遇到极端情景,那就是要在同意时间向服务器发起多个请求,也就是我们常说的并发请求。那么今天就让我们来学习下RetroHttp
中关于并发请求
的知识吧。
今天涉及知识内容:
- 并发请求
-
RetroHttp
中支持并发请求的方法 - ObservableHelper 之并发请求的使用
- 需要注意的问题
一. 并发请求
并发请求
就是在某一时间向服务器同时发起多个网络请求。
二. RetroHttp中支持并发请求的方法
之前讲过ObservableHelper
是支持串联请求
的。其实ObservableHelper
中也有支持并发请求
的方法,该方法如下:
/***
* 同时发起多个通讯的Observable(并发通讯)
*
* @param length
* @param listener
* @return
*/
public static Observable getObservableByArray(int length, OnObservableListener listener)
三.ObservableHelper 之并发请求的使用
以下贴出ObservableHelper
在Presenter
中发起并发通讯的核心代码(示例):
/**
* 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,今天的内容就介绍到这里了,谢谢大家。
网友评论