总结一次项目中切换速度的优化
2017-11-29 11:28
253 查看
先上个示意图,
(产品市场平台为平板,在我这个720×1280的手机上有两处没适配好, 请先忽略 = =!)
场景是:
点击中间那一堆gridview,“红松”、“樟子松”之类的,下面的布局切换显示对应的数据;
传入的参数用于其他功能,这里用getView()对外暴露行布局view,用于在动态添加到容器布局中;
切换时布局不变,只读取数据传给行对象进行数据刷新即可;
(当然这里也是看具体情况的,需求径级为6~120,差值为2,有60行,不算多,如果有上千行那可能就会影响到界面打开时的速度了)
先来看下之前的方法:遍历集合取值更新
既然统一保存时间长,那可以化整为零,采用输入即时保存,用户每记录一个值就保存一次,这样保存操作由原来的1000ms拆分为10ms;
保存的活还是交给行对象本身处理:
到这里切换速度已经大大提升了,能够满足用户的需求了;
但再进一步分析,发现大部分用户只需要统计径级60之前的,60以后的树木很少很少,那么切换前后这些株树为0的行对象再进行刷新岂不是无用功;
所有,最后一步,第一次数据填充时每个行对象给自己的edittext设置tag,标记当前是否为0;
切换时满足切换前后都为0的条件,直接返回;
这样,切换速度在我这个渣机上都能实现秒切了。
(产品市场平台为平板,在我这个720×1280的手机上有两处没适配好, 请先忽略 = =!)
场景是:
点击中间那一堆gridview,“红松”、“樟子松”之类的,下面的布局切换显示对应的数据;
1、改listview为自定义的行对象
首先,刚开始使用listview展示一行行的内容,但在getview里增加对株树的内容监听来自动计算蓄积值,包括对+1-1按钮增加的点击音效,每滑动都会调用getview来进行复用,滑动效果有点卡顿,所以这里把每一行看成一个对象,计算逻辑由对象处理,动态添加行对象到布局里,这样滑动起来就非常流畅了;public class YdQiaomuOneLineView { private View view; public YdQiaomuOneLineView(Context context,List<Tree> list,int i, IdbHelper helper) { mContext=context; mDatas = list; position = i; this.helper = helper; helper.setTableName("eachWood"); view=View.inflate(context, R.layout.oneline_ydsur_qiaomu, null); //... } public View getView() { return view; } }
传入的参数用于其他功能,这里用getView()对外暴露行布局view,用于在动态添加到容器布局中;
/** * 新增一条布局 * @param one */ private void addOneLinearLayout(int position) { YdQiaomuOneLineView oneLineView = new YdQiaomuOneLineView(mContext, allTrees,position,helper); showViews.add(oneLineView); ll_container.addView(oneLineView.getView()); }
切换时布局不变,只读取数据传给行对象进行数据刷新即可;
(当然这里也是看具体情况的,需求径级为6~120,差值为2,有60行,不算多,如果有上千行那可能就会影响到界面打开时的速度了)
2、改变存储策略提高切换速度
之前的存储方式是传统的切换树种时将新数据保存到数据库,保存的过程有1~2秒时间,虽然是子线程+进度圆处理,但用户还反馈体验不佳,想达到秒切秒换的效果。先来看下之前的方法:遍历集合取值更新
/** * 切换时保存,优化速度未用,改为输入即时更新 */ private void saveSmallType(){ Map<String, String> map = new HashMap<String, String>(); helper.setTableName("eachWood"); if (allTrees!=null && allTrees.size()>0) { for (int i = 0; i < allTrees.size(); i++) { map.put("id", allTrees.get(i).getId()); map.put("treeNum", allTrees.get(i).getTreeNum()+""); map.put("treeXuj", allTrees.get(i).getTreeXj()+""); helper.update(map); } } }
既然统一保存时间长,那可以化整为零,采用输入即时保存,用户每记录一个值就保存一次,这样保存操作由原来的1000ms拆分为10ms;
保存的活还是交给行对象本身处理:
m_tree_zs.addTextChangedListener(watcher);
private TextWatcher watcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { //保存逻辑就不贴了,都是业务类的东西 } };
到这里切换速度已经大大提升了,能够满足用户的需求了;
但再进一步分析,发现大部分用户只需要统计径级60之前的,60以后的树木很少很少,那么切换前后这些株树为0的行对象再进行刷新岂不是无用功;
所有,最后一步,第一次数据填充时每个行对象给自己的edittext设置tag,标记当前是否为0;
if (curTree.isEmtpy()) { m_tree_zs.setTag(true); }else { m_tree_zs.setTag(false); }
切换时满足切换前后都为0的条件,直接返回;
/** * 传入数据重置界面 * @param list * @param i * @param editable */ public void refreshData(List<Tree> list,int i,boolean editable){ Tree curTree = mDatas.get(position); if (((Boolean)m_tree_zs.getTag()) && curTree.isEmtpy()) { return; } //... }
这样,切换速度在我这个渣机上都能实现秒切了。
相关文章推荐
- 项目问题总结三、分表跨月查询速度优化
- 记一次cocos项目的加载速度优化
- 一次关于切换场景的加载速度的优化的报告文档。
- Android实战 - 个人乐逗项目 (项目改动,优化和总结)
- 项目优化经验分享(八)TeamLeader经验总结
- 性能优化项目的总结
- 一次优化web项目的经历记录(二)
- MetaQ (RocketMQ) 小包消息优化项目中期总结
- 使用ant优化android项目编译速度,提高工作效率
- 项目新增内存表优化软件速度
- Android studio 项目构建二|优化编译速度(2)
- Android4.0开机启动速度优化过程经验总结
- 页面速度优化个人总结
- 微网站活动中的项目优化总结
- 数据库查询优化方案(处理上百万级记录如何提高处理查询速度)总结不好之处请指点----
- 记一次Entity Framework 项目的优化过程
- Android视频播放项目总结之 适配器绑定视频信息列表显示到界面(适配器简单优化)
- Java项目中总结的一些优化
- JavaScript 项目优化总结
- 国航OA项目技术总结(二)关于JVM虚拟机中对象的创建,手机端提速的重要优化