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循环中进行异步数据操作,数据排序错乱问题解决;的更多相关文章

  1. Postman中添加真实请求(Chrome Networks中的全部请求,含https)copy as har

    Postman中添加真实请求(Chrome Networks中的全部请求,含https) xyxzfj 关注 2018.05.22 19:44* 字数 559 阅读 1176评论 0喜欢 0 Post ...

  2. 2016/05/13 Thinkphp 3.2.2 ①数据添加 ②收集表单数据入库操作 ③数据修改操作

    ①数据查询 add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 数组方式数据添加 $goods = D(“Goods”); $arr = array(‘goods_name’=&g ...

  3. Vue中发送ajax请求——axios使用详解

    axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...

  4. ajax请求返回数据,模板中的数据处理

    /*ajax请求返回数据,模板中的数据处理*/ function QueryGameAsset(){ var new_start_time=$('#new_start_time').val();//开 ...

  5. 联网请求数据:Android篇

    这篇文章主要回顾之前的MYangtzeu App教程的联网请求方法和json解析套路,主要目的是实现左侧菜单数据的联网获取. 1.先上请求地址实体类Constants.java package com ...

  6. 在 Angular6 中使用 HTTP 请求服务端数据

    第一步 准备好api接口地址, 例如 https://api.example.com/api/ 第二步 在根组件 app.module.ts 中引入 HttpClientModule 模块. // a ...

  7. 远程请求json数据,list中显示

    public class MainActivity extends Activity { protected static final int WHAT_REQUEST_SUCCESS = 1; pr ...

  8. HashMap封装的数据用循环快速添加进list中产生的数据集全部相同的问题

    一.问题概述 在一次使用SimpleAdapter时,Data需要使用传入一条数据(Image.Text),该数据条使用HashMap封装.在用HashMap封装的数据用循环快速添加进list中产生了 ...

  9. springMVC中对HTTP请求form data和request payload两种数据发送块的后台接收方式

    最近在做项目中发现,前台提交数据时,如果通过form表单提交和ajax发送json时,springMVC后台接收不能都通过@ModelAttribute方式处理,经过一番查找后,ajax发送json请 ...

随机推荐

  1. 论 数据库 B Tree 索引 在 固态硬盘 上 的 离散存储

    传统的做法 , 数据库 的 B Tree 索引 在 磁盘上是 顺序存储 的 , 这是考虑到 磁盘 机械读写 的 特性 . 实际上 , B Tree 是一个 树形结构 , 可以采用 链式 存储 , 就是 ...

  2. 决策树原理实例(python代码实现)

    决策数(Decision Tree)在机器学习中也是比较常见的一种算法,属于监督学习中的一种.看字面意思应该也比较容易理解,相比其他算法比如支持向量机(SVM)或神经网络,似乎决策树感觉“亲切”许多. ...

  3. tornado输入-get_query_argument()等 笔记

    最外面的代码结构 import tornado.web import tornado.ioloop import tornado.options import tornado.httpserver f ...

  4. HanLP代码与词典分离方案与流程

    之前在spark环境中一直用的是portable版本,词条数量不是很够,且有心想把jieba,swcs词典加进来, 其他像ik,ansi-seg等分词词典由于没有词性并没有加进来. 本次修改主要是采用 ...

  5. 快速学习hadoop只有这些基础可不行

    “学习hadoop需要什么基础”这已经不是一个新鲜的话题了,随便上网搜索一下就能找出成百上千篇的文章在讲学习hadoop需要掌握的基础.再直接的一点的问题就是——学Hadoop难吗?用一句特别让人无语 ...

  6. Spring Cloud(Dalston.SR5)--Hystrix 断路器-合并请求

    在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的合并请求,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创 ...

  7. Rectified/无限流量/KVM/1G内存/亚洲优化/月付3.99刀起/商家首次续费优惠/91yun第600篇博文

    具体配置如下: 1v CPU + 1G 内存 + 10G SSD + 无限流量( 30T ) + 100M 口 + FreeBSD 支持 + 1IPv4 + IPv6 (可工单) + rDNS = 3 ...

  8. Kafka研究【一】:bring up环境

    kafka是干什么的,有和特性,我这里就不多说,详情自己研究官方文档. 0. 背景介绍 我需要在三台机器上分别部署kafka broker的实例,构建成一个集群.kafka的broker集群,是基于z ...

  9. QQ检测登陆及QQ协议

    QQ协议分析及还原 http://blog.csdn.net/qinggebuyao/article/details/7814499 腾讯的网站如何检测到你的 QQ 已经登录? http://blog ...

  10. 虚拟机中安装centOS及破解nuke的方法

    跟the foundry的工程师邮件交流,我的一个Nuke脚本在对方机器上执行有问题,确认对方是centOS之后我决定在自己机器上安装一个centOS来找一下问题所在.安装重点如下: 一: 一定要下载 ...