如何讓Android UI設計性能更高效

Android在UI優化方面可以從以下五個方面入手:

◆Adapter優化

◆背景和圖片優化

◆繪圖優化

◆視圖和佈局優化

◆內存分配優化

Adapter優化

什麼是Adapter?

Adapter在Android中佔據一個重要的角色,它是數據和UI(View)之間一個重要的紐帶。在常見的View(ListView,GridView)等地方都需要用到Adapter。如圖1直觀的表達了Data、Adapter、View三者的關係。

一、Android中Adapter

在我們使用過程中可以根據自己的需求實現接口或者繼承類進行一定的擴展。比較常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。

BaseAdapter是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性;

ArrayAdapter支持泛型操作,通常需要實現getView方法,特殊情況下(結合數據row id),爲了讓ui事件相應處理方便點最好重寫getItemId;

SimpleCursorAdapter可以適用於簡單的純文字型ListView,它需要Cursor的字段和UI的id對應起來。如需要實現更復雜的UI也可以重寫其他方法。

二、一個繼承BaseAdapter的類的代碼段

Adapter與View的連接主要依靠getView這個方法返回我們需要的自定義view。ListView是Android app中一個最最最常用的控件了,所以如何讓ListView流暢運行,獲取良好的用戶體驗是非常重要的。對ListView優化就是對Adapter中的getView方法進行優化。09年的Google IO大會給出的優化建議如下:

Adapter優化示例代碼:

@Override  
public View getView(int position, View convertView, ViewGroup parent) {  
    Log.d("MyAdapter", "Position:" + position + "---"  
            + String.valueOf(System.currentTimeMillis()));  
    ViewHolder holder;  
     if (convertView == null) {  
        final LayoutInflater inflater = (LayoutInflater) mContext  
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
        convertView = inflater.inflate(R.layout.list_item_icon_text, ull);  
        holder = new ViewHolder();  
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);  
        holder.text = (TextView) convertView.findViewById(R.id.text);  
        convertView.setTag(holder);  
    } else {  
        holder = (ViewHolder) convertView.getTag();  
    }  
    holder.icon.setImageResource(R.drawable.icon);  
    holder.text.setText(mData[position]);  
    return convertView;  
}  
   
static class ViewHolder {  
    ImageView icon;  
   
    TextView text;
}

以上是Google io大會上給出的優化建議,經過嘗試ListView確實流暢了許多。

@Override  
public View getView(int position, View convertView, ViewGroup parent) {  
     Log.d("MyAdapter", "Position:" + position + "---"  
             + String.valueOf(System.currentTimeMillis()));  
         final LayoutInflater inflater = (LayoutInflater) mContext  
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
        View v = inflater.inflate(R.layout.list_item_icon_text, null);  
         ((ImageView) v.findViewById(R.id.icon)).setImageResource(R.drawable.icon);  
         ((TextView) v.findViewById(R.id.text)).setText(mData[position]);  
        return v;  
 }  

以上是不建議的做法!!

不過我們還是要懷疑一下,SO,我們還是來測試對比一下。

測試說明:

大家可以看到在getView的時候我們通過log打印出position和當前系統時間。我們通過初始化1000條數據到Adapter顯示到ListView,然後滾動到底部,計算出position=0和position=999時的時間間隔。

測試機子:HTC Magic

測試實錄:打開測序,讓ListView一直滾動底部。

測試結果:

兩種情況在操作過程中體驗明顯不同,在優化的情況下流暢很多很多!

1、優化建議測試結果

  1. 12-05 10:44:46.039: DEBUG/MyAdapter(13929): Position:0---1291517086043   
  2. 12-05 10:44:46.069: DEBUG/MyAdapter(13929): Position:1---1291517086072   
  3. 12-05 10:44:46.079: DEBUG/MyAdapter(13929): Position:2---1291517086085  
  4.  
  5. ……  
  6.  
  7. 12-05 10:45:04.109: DEBUG/MyAdapter(13929): Position:997---1291517104112   
  8. 12-05 10:45:04.129: DEBUG/MyAdapter(13929): Position:998---1291517104135   
  9. 12-05 10:45:04.149: DEBUG/MyAdapter(13929): Position:999---1291517104154  
  10.  
  11. 耗時:17967  
  12.  

2、沒優化的測試結果

  1. 12-05 10:51:42.569: DEBUG/MyAdapter(14131): Position:0---1291517502573   
  2. 12-05 10:51:42.589: DEBUG/MyAdapter(14131): Position:1---1291517502590   
  3. 12-05 10:51:42.609: DEBUG/MyAdapter(14131): Position:2---1291517502617  
  4.  
  5. ……  
  6.  
  7. 12-05 10:52:07.079: DEBUG/MyAdapter(14131): Position:998---1291517527082   
  8. 12-05 10:52:07.099: DEBUG/MyAdapter(14131): Position:999---1291517527108   
  9.  
  10. 耗時:24535  
  11.  

在1000條記錄的情況下就有如此差距,一旦數據nW+,ListView的Item佈局更加複雜的時候,優化的作用就更加突出了!


發佈了25 篇原創文章 · 獲贊 16 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章