这几天接了一个祖传代码,有段代码如下
for (int i = 0; i < ids.size(); i++) {
String actualAmount = "0.00";
String planAmount = "0.00";
WorkDetailBean bean = new WorkDetailBean();
for (int j = 0; j < length; j++) {
CheckBean skuListBean = companyBeanList.get(j);
if (ids.get(j).equals(skuListBean.getSkuId())) {
List<checkInfo> infoList = new Gson().fromJson(skuListBean.getCheckInfo(), new TypeToken<List<checkInfo>>() {
}.getType());
String amount = "0.00";
try {//没有限制输入类型 string就崩溃掉了
for (int k = 0; k < infoList.size(); k++) {
amount = Arith.add(amount, Arith.mul(String.valueOf(infoList.get(k).getNum()), infoList.get(k).getRate()));
bean.setUnit(infoList.get(k).getName());
}
} catch (Exception e) {
bean.setUnit("");
e.printStackTrace();
continue;
}
bean.setStandardWeight(skuListBean.getStandardWeight());
bean.setCheck(skuListBean.getCheck());
}
中间赋值代码很多 去除了一部分无用代码。
一开始没发现问题,因为开发和测试环境也都OK 也就没注意,但是版本发出去之后,线上反馈问题卡顿.就排查发现问题在这里
companyBeanList = MyApplication.mDBMaster.mCheckDBDao.queryDataList(orderId);
这是本地一个订单商品表,切到线上debug一看吓一跳 900多个数据
然后三个900多次的for循环导致卡死,我当时都泪目了。怎么办,改吧。 又不敢乱改,阅读代码发现最外层 只声明了值
for (int i = 0; i < ids.size(); i++) {
String actualAmount = "0.00";
String planAmount = "0.00";
WorkDetailBean bean = new WorkDetailBean();
最后改动如下:
for (int j = 0; j < length; j++) {
String actualAmount = "0.00";
String planAmount = "0.00";
WorkDetailBean bean = new WorkDetailBean();
CheckBean skuListBean = companyBeanList.get(j);
if (actualAmountMap.containsKey(skuListBean.getSkuId())) {
actualAmount = String.valueOf(actualAmountMap.get(skuListBean.getSkuId()));
planAmount = String.valueOf(planAmountMap.get(skuListBean.getSkuId()));
} else {
actualAmountMap.put(planAmountMap.get(skuListBean.getSkuId()), "0.00");
planAmountMap.put(planAmountMap.get(skuListBean.getSkuId()), "0.00");
}
去除了最外层一次循环,问题就解决了,暂时没发现其他问题。
完毕。。。。