现在的位置: 首页 > 综合 > 正文

Android学习札记43:TraceView实战篇

2017年12月17日 ⁄ 综合 ⁄ 共 2834字 ⁄ 字号 评论关闭

本篇文章中记录了使用 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










抱歉!评论已关闭.