android TraceView使用以及listview 的效能最佳化測試(二)

來源:互聯網
上載者:User

 接上篇的 android TraceView使用以及listview 的效能最佳化測試(一)

上篇最後面給了我測試用的代碼: 未看到請先瀏覽上一篇:

好現在咋門來驗證listView 的神奇,listview主要需要最佳化的就是getView() 這個方法,實現其中convertView 的緩衝最佳化,下面就利用TraceView 測試下listview重用convertView  的區別:

 首先啥都不做:

   

public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubLinearLayout 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%    整個程式中inflated 就佔33%,getView()方法就是全被布局填充耗費了這麼多的資源, 看不下去了

最佳化一

直接加兩行代碼:

if(convertView ==null){layout = (LinearLayout) inflater.inflate(R.layout.listview, null);}else{layout =(LinearLayout) convertView;}

  在運行 ,在查看getview:

看到沒有,看到沒有:9.4%  占整個程式的9.4% ,並且 inflated 在getview中只耗費了41.7%了,一半多的節省啊!

兩行的代碼就帶來這麼大的效率提高: 難道你沒覺察到! 神奇

 

最佳化二

下面是網上盛傳的:ViewHolder 最佳化測試 通過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會臨時消耗更多的記憶體,所以不可盲目使用,依實際情況而定。

 

希望對你有協助!

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.