本篇文章中记录了使用 TraceView 对 ListView 进行性能优化的完整过程
首先啥都不做:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
TextView text = (TextView) layout.findViewById(R.id.text);
ImageView view= (ImageView) layout.findViewById(R.id.iamge);
text.setText(listData.get(position));
int id = position % 2 == 1 ? R.drawable.icon : R.drawable.default_head;
view.setImageResource(id);
return layout;
}
运行程序,然后随意的拖动 ListView 列表,然后点击菜单键退出程序;去 DDMS 中 FileExplorer 中 找到 SD 卡,你会发现根目录上多了个 dmtrace.trace 文件;把 dmtrace.trace 文件导出到 C 盘 ,命令行键入 android tools 文件夹下执行 traceview C:\dmtrace.trace ,接着就会出现 TraceView 窗口。
因为我们要的是对 getView()方法进行优化操作,所以直接在 Find 键入 getView():
看到没有,在未进行优化的情况下 getView() 方法占用资源是 35.2%,其中布局填充(inflate)占其中的89.7%,整个程序中 inflate 就占 33%,getView() 方法就是全被布局填充耗费了这么多的资源,看不下去了。
优化一
直接加两行代码:
if (convertView ==null) {
layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
} else {
layout =(LinearLayout) convertView;
}
运行,再次查看:
看到没有,看到没有,9.4%,占整个程序的 9.4%,并且 inflate 在 getView() 中只耗费了 41.7% 了,一半多的节省啊!两行的代码就带来这么大的效率提高,难道你没觉察到,神奇!
优化二
下面是网上盛传的 setTag() 方法:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// LinearLayout layout;
// if (convertView ==null) {
// layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
// } else {
// layout = (LinearLayout) convertView;
// }
//
// TextView text = (TextView) layout.findViewById(R.id.text);
// ImageView view = (ImageView) layout.findViewById(R.id.iamge);
//
// text.setText(listData.get(position));
// int id = position % 2 == 1 ? R.drawable.icon : R.drawable.default_head;
// view.setImageResource(id);
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.listview, null);
holder = new ViewHolder();
holder.view = (ImageView) convertView.findViewById(R.id.iamge);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
int id= position %2==1? R.drawable.icon: R.drawable.default_head;
holder.view.setImageResource(id);
holder.text.setText(listData.get(position));
return convertView;
}
static class ViewHolder {
TextView text;
ImageView view;
}
测试效果是比优化一的结果好了一点点:主要在于 findViewByID 比 findViewByTag 少了很多
优化三
if (convertView == null) {
convertView = inflater.inflate(R.layout.listview, null);
convertView.setTag(R.id.text, convertView.findViewById(R.id.text));
convertView.setTag(R.id.iamge, convertView.findViewById(R.id.iamge));
}
( (TextView) convertView.getTag(R.id.text) ).setText( listData.get(position) );
int id = position % 2 == 1 ? R.drawable.icon : R.drawable.default_head;
( (ImageView)convertView.getTag(R.id.iamge) ).setImageResource(id);
运行结果:
大家也看到了,跟优化一是差不多的最终的效果。
也许结果不是很准确,但至少我们知道了怎么使用 TraceView 来帮助我们,同时也知道了对 ListView 进行优化的方法,具体采用哪种方法还需要看具体的需求,对于性能要求很高的,推荐优化二;对于一般的应用,优化一足够了。
再有就是对 setTag 和findById 的使用情况,经过测试证明了:View 本身会因为 setTag 而占用更多的内存,还会增加代码量;而 findViewById 会临时消耗更多的内存,所以不可盲目使用,依实际情况而定。
转载自:
http://blog.csdn.net/liao3841054/article/details/7162428