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请 ...
随机推荐
- 记一个视频播放器插件 video.js
最近在看扣丁学堂上面的一些视频, 突然对他用的视频播放器有点兴趣, 他也是采用的 ts切片播放, 如果使用传统的video标签是无法实现的 他使用的插件叫做 video.js 官网地址 官网提供的播放 ...
- java 对象的创建
jvm在创建对象时,首先判断该对象所对应的类是否已经被加载.链接和初始化,如果没有则先执行类的加载过程.类的加载过程见 java类加载. 类加载检查通过后,虚拟机在堆中为新生对象分配内存. 内存分配完 ...
- 动态设置所有string字段不分词
PUT http://192.168.1.12:9200/test { "settings": { "number_of_shards": 3, &qu ...
- verilog编码规范
verilog编码规范 1.Register with Rising-Edge Coding Example (Verilog) Flip-Flops and Registers Control Si ...
- 回顾<Video Timing Controller v6.1>
回顾<Video Timing Controller v6.1> VTC总体架构图: 对于最基本的功能:视频时序产生
- padding margin
padding:内边距 margin:外边距 内外边距是针对本标签相对于它相邻的标签而言. margin: 10px;是本标签与它周围上下左右有10像素的空白. padding: 10px;本标签其实 ...
- SQL Server孤立账户解决办法
选择你想要的数据库. 执行 exec sp_change_users_login 'UPDATE_ONE','用户名','登录名' 假如你的登录名是:sd exec sp_change_users_l ...
- 从错误0x80070522,谈强制完整性控制(MIC)。
在Windows 7碰到一个奇怪的问题,DE二个盘,NTFS的权限(属性--安全页)一模一样,没有任何区别,但在E盘根目录可以创建文件或文件夹,而在D盘根目录下报错:0x80070522,如果使用应用 ...
- uoj#274. 【清华集训2016】温暖会指引我们前行
http://uoj.ac/problem/274 由于边权互不相同,只需用lct维护带加边的最大生成树 #include<bits/stdc++.h> #define lc ch][0 ...
- 优化 要引入多个 模块 使用调用的方法,让管理更便捷 --execfile() 函数
1.这里要使用的execfile('a.py') 函数,执行写了引入模块的py. 例子: b.py内容如下: #-*- coding: UTF-8 -*-#调用函数apisys.path.append ...