接上篇的 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會臨時消耗更多的記憶體,所以不可盲目使用,依實際情況而定。
希望對你有協助!