android优化问题
2013-12-10 17:48
225 查看
1、listview优化问题
(参考http://www.androidmi.com/Androidkaifa/jinjie/201101/2678.html)
针对ListView卡的要死的问题,有一个广为流传的 ViewHolder、ViewCache的优化办法:
大概思想是setTag();getTag();来保存已经加载过了的
ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想。
但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求Listview的展现可以看成是分页,系统会加载第一页
我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们
holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list,
null);
holder.title = (TextView) convertView.findViewById(R.id.title);
开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。
但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview
而且里面的image是从网络上的,而且你没有存到本地之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据在来回拖拽的时候也要再操作一遍就会令人无法忍受!
怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。
个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。
但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<Integer, View> 储存对应的View
20行带较大的图片的listView来回拖拽毫无压力。
(参考http://www.androidmi.com/Androidkaifa/jinjie/201101/2678.html)
针对ListView卡的要死的问题,有一个广为流传的 ViewHolder、ViewCache的优化办法:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list, null); holder.title = (TextView) convertView.findViewById(R.id.title); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } } public class ViewHolder { public TextView getTitle() { if (title == null) { title = (TextView) baseView.findViewById(R.id.title); } return title; } }
大概思想是setTag();getTag();来保存已经加载过了的
ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想。
但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求Listview的展现可以看成是分页,系统会加载第一页
我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们
holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list,
null);
holder.title = (TextView) convertView.findViewById(R.id.title);
开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。
但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview
而且里面的image是从网络上的,而且你没有存到本地之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据在来回拖拽的时候也要再操作一遍就会令人无法忍受!
怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。
个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。
但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<Integer, View> 储存对应的View
HashMap<Integer, View> m = new HashMap<Integer, View>(); public View getView(int position, View view, ViewGroup parent) { View convertView = m.get(position); if (convertView != null) { return convertView; } else { convertView = inflater.inflate(R.layout.topic_list, null); TextView title = (TextView) convertView .findViewById(R.id.title); m.put(position, convertView); } }暂时就这样了,潜在的问题和其他优化没有细想,成果是
20行带较大的图片的listView来回拖拽毫无压力。
相关文章推荐
- Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
- Android 之 WebView开发问题及优化
- Android UI性能优化实战 识别绘制中的性能问题
- Android 性能优化之使用MAT分析内存泄露问题
- Android 性能优化之使用MAT分析内存泄露问题
- Android 性能优化之使用MAT分析内存泄露问题
- Android内存问题及常见优化
- Android中方法数超限问题与启动优化详解
- Android中ListView的优化问题
- android性能优化总纲——性能问题及性能调优方式(一)
- Android UI性能优化实战 识别绘制中的性能问题
- Android 性能优化之使用MAT分析内存泄露问题
- Android WebView开发问题及优化汇总
- Android有效解决加载大图片内存溢出问题及优化虚拟机内存
- android 内存优化以及性能优化相关问题
- Android WebView开发问题及优化汇总
- 最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(二)
- android 图片内存溢出问题解决与优化
- Android 性能优化之使用MAT分析内存泄露问题
- Android项目打包开启proguard的混淆优化带来的问题