因为公司外包的一个安卓的app,在写入sqllite 数据库的时候效率奇低。同步10w多条数据耗时平均20多分钟。
帮忙调试的,发现问题如下:
- for循环里去进行插入数据操作
- JSON 数组 进行for循环,new GSON解析数据
- 1w多条数据进行两次循环组装排序后一次性渲染到树形显示列表
第一个问题比较好解决
使用他使用ormlite 提供的 callBatchTasks 方法进行保存。而不是每次循环进行保存。
最终优化方法:
现组装需要保存的各个集合,然后在一个callBatchTasks 里,进行create.
- dao.callBatchTasks(new Callable<Object>() {
- @Override
- public Object call() throws Exception {
- xx1dao.create(new xx1());
- xx2dao.create(new xx2());
- xx3dao.create(new xx3());
- return null;
- }
- });
第二个 JSON 问题解决:
List list = JSONObject.parseArray(arrayJson, Xxx.class);
或
JSONReader reader = new JSONReader(new FileReader(“/tmp/huge.json”));
reader.startArray();
while(reader.hasNext()) {
VO vo = reader.readObject(VO.class);
// handle vo …
}
reader.endArray();
reader.close();
如果是gson:
List<Xxx> persons =gson.fromJson(json, new TypeToken<List<Xxx>>() {}.getType());
第三个问题:
两种方式:
- 通过异步方式加载-默认只加载根,点击后在加载子
- 逐步加载,每次加载100个节点,动态渲染
初步解决 1、2 (粗略优化) 由下载插入需要10多分钟,优化为 4-5分钟。