android TraceView使用以及listview 的性能优化测试(一)

 今天看了下文档,说TraceView 对程序的的性能和优化有很大的帮助:

本人比较懒,文章也没继续往下下看,直接百度了下TraceView  的使用技巧,资源很多,介绍怎么使用

 推荐:http://blog.csdn.net/itachi85/article/details/6857324

 当然具体怎么做的步骤简单的一下,大概分这么几步:

 一:在创建avd ,给sd卡的内存大一点,因为后面的debug.raceView  生成的文件可能比较的大。

二:写一个测试的程序: 

[html]  view plain copy
  1. Debug.startMethodTracing();  

有开始当然必须有结束,如果不掉用Debug.stopMethodTracing();  在sd卡的根目录上则不会出现dmtrace.trace 文件

 

[java]  view plain copy
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    


 

[html]  view plain copy
  1. note:建议在onPuse()方法中调用Debug.stopMethodTracing ,不建议在ondestory() 或者onstop()方法中调用,因为有可能程序在莫名的情况下不一定会走ondestory,和onstop ,所以在onpuse中比较的靠谱  

三: 运行前不要着急:记得给sd卡加权限 否则会抛权限异常的:

 

四: 生成了dmtrace.trace文件当然需要看了啊! 怎么看,google人性化,在android 开发工具中的 tools 中有个TraceView 工具只你只要

cmd 到该目录下,然后再把sd卡上的dmtrace.trace 文件导入到pc 的 某个路劲 (默认是的:c\dmtrace.trace)

然后执行:traceview C:\dmtrace.trace (自己的路劲哦)

物: 然后你就看打如下界面:

看到界面是不是晕了啊!:

这个咋看啊 ! 刚开始进来我也不知道看啥,也不知道怎么看,不懂百度:

原来:

[html]  view plain copy
  1. 在traceview的右半部统计字段中:  
[html]  view plain copy
  1. Exclusive: 同级函数本身运行的时间Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间  
[html]  view plain copy
  1. Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent 和Children子项,就是指被调用和调用。  
[html]  view plain copy
  1. Incl: inclusive时间占总时间的白分比  
[html]  view plain copy
  1. Excl: 执行占总时间的白分比。  
[html]  view plain copy
  1. Calls+Recur Calls/Total: 调用和重复调用的次数  
  2. Time/Call: 总的时间。(ms)  
  3.   是不是明白了些  


本人还有个使用的心得,跟大家分享下: 就是你看到下面的数据这么多,又不知道看什么好时,最底下是不是有一个过滤栏,如果没有他你眼睛都会被晃瞎啊,因为数据太多了

好上面是简单的 TraceView  使用:

 

下面咋门用他来验证下,是不是有这么的神奇啊 !

不验证其他的就用他来验证我的Listview性能 ,这个问题很纠结我很长的一段时间了,因为listview优化网上给出了很多不同的版本和意见:

 

关于listView 优化的: http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html

[java]  view plain copy
  1. package com.liao.listadpter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.ListActivity;  
  7. import android.os.Bundle;  
  8. import android.os.Debug;  
  9.   
  10. public class MainActivity extends ListActivity {  
  11.     private List<String> data;  
  12.   
  13.     /** Called when the activity is first created. */  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         //setContentView(R.layout.main);  
  19.         Debug.startMethodTracing();  
  20.           
  21.         initData();  
  22.           
  23.         initadapter();  
  24.         
  25.     }  
  26.     public void initData() {  
  27.       
  28.           
  29.         data = new ArrayList<String>();  
  30.           
  31.         for (int i = 0; i < 1000; i++) {  
  32.             data.add("test: " + i);  
  33.         }  
  34.     }  
  35.   
  36.     public void initadapter() {  
  37.           
  38.         TestAdapter testAdapter = new TestAdapter(data, MainActivity.this);  
  39.           
  40.         this.setListAdapter(testAdapter);  
  41.     }  
  42.   
  43.     @Override  
  44.     protected void onPause() {  
  45.         // TODO Auto-generated method stub  
  46.         super.onPause();  
  47.         Debug.stopMethodTracing();  
  48.     }  
  49. }  


adapter 信息

[java]  view plain copy
  1. package com.liao.listadpter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.w3c.dom.Text;  
  6.   
  7. import android.content.Context;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.TextView;  
  15.   
  16. public class TestAdapter extends BaseAdapter{  
  17.       
  18.     private List<String> listData;  
  19.     private Context context;  
  20.     private LayoutInflater inflater;  
  21.     private LinearLayout layout;  
  22.   
  23.     TestAdapter(List<String> listData ,Context context){  
  24.         this.listData =listData;  
  25.         this.context =context;  
  26.         inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);  
  27.     }  
  28.   
  29.     public int getCount() {  
  30.         // TODO Auto-generated method stub  
  31.         return listData.size();  
  32.     }  
  33.   
  34.     public Object getItem(int position) {  
  35.         // TODO Auto-generated method stub  
  36.         return listData.get(position);  
  37.     }  
  38.   
  39.     public long getItemId(int position) {  
  40.         // TODO Auto-generated method stub  
  41.         return position;  
  42.     }  
  43.   
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         // TODO Auto-generated method stub  
  46.           
  47.         if(convertView ==null){  
  48.             layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  49.               
  50.         }  
  51.           
  52.         else{  
  53.             layout = (LinearLayout) convertView;  
  54.         }  
  55.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  56.          ((ImageView) layout.findViewById(R.id.iamge)).setImageResource(id);  
  57.          ((TextView) layout.findViewById(R.id.text)).setText(listData.get(position));;  
  58.   
  59. //      TextView text = (TextView) layout.findViewById(R.id.text);  
  60. //      ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  61. //        
  62. //      text.setText(listData.get(position));  
  63.           
  64.       
  65.           
  66.         return layout;  
  67.     }  
  68.      static class ViewHoder{  
  69.         public TextView text;  
  70.         public ImageView view;  
  71.           
  72.     }  
  73.   
  74. }  


 下面是xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation ="horizontal"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="wrap_content"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="list 1"  
  11.     android:id ="@+id/text"  
  12.     android:layout_gravity = "center_vertical"  
  13.     />  
  14. <ImageView    
  15.     android:layout_width="wrap_content"   
  16.     android:layout_height="wrap_content"   
  17.     android:id ="@+id/iamge"  
  18.     android:src ="@drawable/icon"  
  19.     />  
  20. </LinearLayout>  


效果图:


好现在咋门来验证listView 的神奇,listview主要需要优化的就是getView() 这个方法,实现其中convertView 的缓存优化,下面就利用TraceView 测试下listview重用convertView  的区别:

 首先啥都不做:

   

[html]  view plain copy
  1. public View getView(int position, View convertView, ViewGroup parent) {  
  2.         // TODO Auto-generated method stub  
  3.         LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  4.         TextView text = (TextView) layout.findViewById(R.id.text);  
  5.         ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  6.           
  7.         text.setText(listData.get(position));  
  8.         int idposition %2==1? R.drawable.icon: R.drawable.default_head;  
  9.         view.setImageResource(id);  
  10.           
  11.         return layout;  
  12.     }  


运行程序,然后随意的拖动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%    整个程序中inflated 就占33%,getView()方法就是全被布局填充耗费了这么多的资源, 看不下去了

优化一

直接加两行代码:

[java]  view plain copy
  1. if(convertView ==null){  
  2.         layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  3.     }else{  
  4.         layout =(LinearLayout) convertView;  
  5.     }  

  在运行 ,在查看getview:


看到没有,看到没有:9.4%  占整个程序的9.4% ,并且 inflated 在getview中只耗费了41.7%了,一半多的节省啊!

两行的代码就带来这么大的效率提高: 难道你没觉察到! 神奇

 

优化二

下面是网上盛传的:ViewHolder 优化测试 通过setTAG

[java]  view plain copy
  1. public View getView(int position, View convertView, ViewGroup parent) {  
  2.         // TODO Auto-generated method stub  
  3. //      LinearLayout layout;  
  4. //      if(convertView ==null){  
  5. //          layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  6. //      }else{  
  7. //          layout =(LinearLayout) convertView;  
  8. //      }  
  9. //        
  10. //      TextView text = (TextView) layout.findViewById(R.id.text);  
  11. //      ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  12. //        
  13. //      text.setText(listData.get(position));  
  14. //      int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  15. //      view.setImageResource(id);  
  16.           
  17.          ViewHolder holder;  
  18.          if (convertView == null) {  
  19.              convertView = inflater.inflate(R.layout.listview,  
  20.                      null);  
  21.              holder = new ViewHolder();  
  22.              holder.view = (ImageView) convertView.findViewById(R.id.iamge);  
  23.              holder.text = (TextView) convertView.findViewById(R.id.text);  
  24.              convertView.setTag(holder);  
  25.          }  
  26.          else{  
  27.              holder = (ViewHolder)convertView.getTag();  
  28.          }  
  29.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  30.          holder.view.setImageResource(id);  
  31.          holder.text.setText(listData.get(position));  
  32.   
  33.           
  34.         return convertView;  
  35.     }  
  36.      static class ViewHolder {  
  37.             TextView text;  
  38.             ImageView view;  
  39.         }  

  测试效果是比 优化一 好点点: 主要在于findviewbyID 比findviewbyTag少了很多


优化三

[java]  view plain copy
  1. if (convertView == null) {  
  2.              convertView = inflater.inflate(R.layout.listview, null);  
  3.              convertView.setTag(R.id.text, convertView.findViewById(R.id.text));  
  4.              convertView.setTag(R.id.iamge, convertView.findViewById(R.id.iamge));  
  5.          }  
  6.          ((TextView) convertView.getTag(R.id.text)).setText(listData.get(position));  
  7.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  8.          ((ImageView) convertView.getTag(R.id.iamge)).setImageResource(id);  


 大家也看到了。跟优化一是差不多的最终的效果

也许结果不是很准确,但至少我们知道了怎么使用traceView 来帮助我们,同时也知道了listview一定的优化,具体采用哪种优化还需要看具体的需求,

对于性能要求很高的 推荐,优化二,对于一般的应用优化一足够了,再有就是settag 和findbyid 使用情况,经过测试证明了:

View本身因为setTag而会占用更多的内存,还会增加代码量;而findViewById会临时消耗更多的内存,所以不可盲目使用,依实际情况而定。

 转载出处: http://blog.csdn.net/liao3841054/article/details/7162181
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值