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

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

        //...
    }

这样,切换速度在我这个渣机上都能实现秒切了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值