for循环中进行联网请求数据、for循环中进行异步数据操作,数据排序错乱问题解决;
for循环中进行联网请求数据,由于网络请求是异步的,第一个网络请求还没有回调,第二次第三次以及后续的网络请求又已经发出去了,有可能后续的网络请求会先回调;这时我们接收到的数据的排序就会错乱;怎么才能让数据和for循环进行异步操作之前的顺序一样呢;
1、网络请求使用同步请求,串型请求,等第一个网络请求回调后再去请求第二个;
2、递归迭代,异步的网络请求,在当前请求完成后再去递归请求下一个;
但是这两种方式都不是并发的,如果数据特别的多一个一个的去请求就会特别的耗时,我们用for循环异步去请求就会同时相应,速度回很快;
3、重点要说的:for循环中进行联网请求数据,解决数据排序错乱问题。
第一:记录下来这个for循环 原集合的索引位置(集合中的对象添加一个indexes的字段),用来后续的排序;
第二:异步请求后数据会错乱,这时我们根据indexes的大小进行排序;
代码如下:仅留下解决数据排序错乱问题的代码;
//原数据中缺少一个字段,需要异步请求网络拿到这个字段,全部的异步请求回调后再对原数据进行排序;
private void initNewCars(List<CarInfo> datas) {
for (int ii = 0; ii < datas.size(); ii++) {
datas.get(ii).indexes = ii; //保存当前车辆的索引位置,等集合遍历完成后进行排序
}
AtomicInteger CarSize = new AtomicInteger(); //等所有的集合都联网循环完毕后再去设置数据
List<CarInfo> Cars = new ArrayList<>(); //遍历后对数据进行操作生成新的集合
for (int i = 0; i < datas.size(); i++) {
int finalI = i;
clwOwnerApi.getAuthVehicleStatus(datas.get(finalI).getVin_code()) //异步网络请求
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResultClw<AuthVehicleStatusBean>>() {
@Override
public void accept(ResultClw<AuthVehicleStatusBean> result) throws Exception {
CarSize.getAndIncrement();
if ("SUCCEED".equals(result.status) && result.data != null) {
if (!"0".equals(result.data.getAuditResult()) && result.data.getVehicleStatus()){
}else {
CarInfo carInfo = datas.get(finalI);
carInfo.isClw = result.data.getVehicleStatus();
Cars.add(carInfo); //数据错乱,需要排序!
}
} else {
UIHelper.showToast(result.errorMessage);
}
if (CarSize.get() >= datas.size()){ //等所有的集合都循环完成了再去设置数据
L.cc("列表排序前:"+GsonUtils.toJson(Cars));
//根据保存的索引位置进行排序
Collections.sort(Cars, new Comparator<CarInfo>() {
@Override
public int compare(CarInfo o1, CarInfo o2) {
return o1.indexes - o2.indexes;
}
});
L.cc("列表排序后:"+GsonUtils.toJson(Cars));
}
}
}, throwable -> {
L.e(throwable,throwable.getMessage());
CarSize.getAndIncrement();
UIHelper.showToast("响应服务器失败,请检查网络连接");
});
}
}
对集合的排序参考:https://blog.csdn.net/veryisjava/article/details/51675036
CarInfo对象:
public class CarInfo {
private String id;
private String series;
private String owner_name;
private String vin_code;
private String is_default;
private String uuid;
private String deliver_date;
private String vin_name;
private String card_id;
private String auth_date;
private String mobile;
public boolean isClw;
public int indexes; //记录当前的位置,用来排序
}
**大致思路:
1、判断集合是否循环完成:异步操作,等所有的异步都完成了再去设置数据;使用AtomicInteger记录数据是否全部遍历完成了;
2、数据错乱问题:先给原数据添加索引位置字段,记录原数据的顺序;异步操作集合后数据错乱,在根据数据的索引字段去排序就OK了,这样的数据的顺序还是和原数据的顺序是一致的,并且是并发的异步请求,速度快效率高;
for循环中进行联网请求数据、for循环中进行异步数据操作,数据排序错乱问题解决;的更多相关文章
- Postman中添加真实请求(Chrome Networks中的全部请求,含https)copy as har
Postman中添加真实请求(Chrome Networks中的全部请求,含https) xyxzfj 关注 2018.05.22 19:44* 字数 559 阅读 1176评论 0喜欢 0 Post ...
- 2016/05/13 Thinkphp 3.2.2 ①数据添加 ②收集表单数据入库操作 ③数据修改操作
①数据查询 add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 数组方式数据添加 $goods = D(“Goods”); $arr = array(‘goods_name’=&g ...
- Vue中发送ajax请求——axios使用详解
axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...
- ajax请求返回数据,模板中的数据处理
/*ajax请求返回数据,模板中的数据处理*/ function QueryGameAsset(){ var new_start_time=$('#new_start_time').val();//开 ...
- 联网请求数据:Android篇
这篇文章主要回顾之前的MYangtzeu App教程的联网请求方法和json解析套路,主要目的是实现左侧菜单数据的联网获取. 1.先上请求地址实体类Constants.java package com ...
- 在 Angular6 中使用 HTTP 请求服务端数据
第一步 准备好api接口地址, 例如 https://api.example.com/api/ 第二步 在根组件 app.module.ts 中引入 HttpClientModule 模块. // a ...
- 远程请求json数据,list中显示
public class MainActivity extends Activity { protected static final int WHAT_REQUEST_SUCCESS = 1; pr ...
- HashMap封装的数据用循环快速添加进list中产生的数据集全部相同的问题
一.问题概述 在一次使用SimpleAdapter时,Data需要使用传入一条数据(Image.Text),该数据条使用HashMap封装.在用HashMap封装的数据用循环快速添加进list中产生了 ...
- springMVC中对HTTP请求form data和request payload两种数据发送块的后台接收方式
最近在做项目中发现,前台提交数据时,如果通过form表单提交和ajax发送json时,springMVC后台接收不能都通过@ModelAttribute方式处理,经过一番查找后,ajax发送json请 ...
随机推荐
- [转]从OSI网络模型到TCP/IP协议族简介
OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...
- MySQL通过Navicat实现远程连接
直接使用Navicat通过IP连接会报各种错误,例如:Error 1130: Host '192.168.1.80' is not allowed to connect to this MySQL s ...
- tornado输入-get_query_argument()等 笔记
最外面的代码结构 import tornado.web import tornado.ioloop import tornado.options import tornado.httpserver f ...
- mysql 主从复制参数slave_net_timeout
slave_net_timeout slave_net_timeout表示slave在slave_net_timeout时间之内没有收到master的任何数据(包括binlog,heartbeat), ...
- kafka重复数据问题排查记录
问题 向kafka写数据,然后读kafka数据,生产的数据量和消费的数据量对不上. 开始怀疑人生,以前奠定的基础受到挑战... 原来的测试为什么没有覆盖生产量和消费量的对比? 消费者写的有问题?反复检 ...
- Centos6.7 运行 eclipse出错解决办法
今天在centos下运行eclipse c++出现来点问题.主要原因是jdk点安装以及环境变量始终不对. 尝试在/etc/profile中手动配置,也没有成功. 做了如下步骤成功解决. 1.查看jdk ...
- Ribbon Ping机制
在负载均衡器中,提供了 Ping 机制,每隔一段时间,会去 Ping 服务器,判断服务器是否存活,该工作由 com.netflix.loadbalancer.IPing 接口的实现类负责,如果单独使用 ...
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- EXCEL 将网络图片地址插入为锁定的图片单元格宏
Sub InsertPic2(ByVal 图片链接 As String, ByVal 插入图片表名 As String, ByVal 插入图片单元格地址 As String) On Error Res ...
- fastdfs远程服务器java连接失败的问题
異常如下: java.net.SocketTimeoutException: connect timed out at java.net.DualStackPlainSocketImpl.waitFo ...