您的位置:首页 > 其它

总结一次项目中切换速度的优化

2017-11-29 11:28 253 查看
先上个示意图,

(产品市场平台为平板,在我这个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;
}

//...
}


这样,切换速度在我这个渣机上都能实现秒切了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  优化