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

来源:互联网 发布:足球比赛 编排软件 编辑:程序博客网 时间:2024/06/08 06:53

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

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

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初生儿嗓子哑了怎么办 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办 大脚趾指甲空了怎么办 脚趾甲长在肉里怎么办 脚趾甲又厚又硬怎么办 小孩子咳嗽有痰怎么办%3f 支气扩张咳血怎么办小 背部第8块脊椎疼怎么办 坐时间长了背疼怎么办 新生儿总哭怎么办吐奶 婴儿吃饱了还哭怎么办 宝宝喉咙哭哑了怎么办 婴儿哭哑了嗓子怎么办 婴儿胖子哭哑了怎么办 孩子声音哭哑了怎么办 喝咖啡手抖心慌怎么办 累了就心慌发抖怎么办 经常头晕心慌胸闷乏力怎么办 在末地迷路了怎么办 在森林里迷路了怎么办 电热宝充电不热怎么办 保温壶按钮坏了怎么办 热水壶盖子坏了怎么办 充电暖宝宝不热怎么办 刚怀孕孕酮低该怎么办 小三怀孕了该怎么办 15学生怀孕了该怎么办