Android開發——09Google I/O之讓Android UI性能更高效(1)

1、前言html

前幾天發現09年Google IO大會關於移動應用方面的主題有一些不錯的PPT,對移動應用開發頗有幫助。本身看了一些,邊看邊和你們分享。既然是PPT就很簡化了,我會根據實際狀況寫一些Demo供你們參考。app

Android在UI優化方面能夠從如下五個方面入手:ide

  • Adapter優化佈局

  • 背景和圖片優化測試

  • 繪圖優化優化

  • 視圖和佈局優化spa

  • 內存分配優化code

    2、Adapter優化移動應用開發

    什麼是Adapter,能夠先看看個人上一篇文章,Android開發——說說Adapter那點事 Adapter與View的鏈接主要依靠getView這個方法返回咱們須要的自定義view。ListView是Android app中一個最最最經常使用的控件了,因此如何讓ListView流暢運行,獲取良好的用戶體驗是很是重要的。對ListView優化就是對Adapter中的getView方法進行優化。09年的Google IO大會給出的優化建議以下:htm

    Adapter優化示例代碼:

       1: @Override
       2: public View getView(int position, View convertView, ViewGroup parent) {
       3:     Log.d("MyAdapter", "Position:" + position + "---"
       4:             + String.valueOf(System.currentTimeMillis()));
       5:     ViewHolder holder;
       6:     if (convertView == null) {
       7:         final LayoutInflater inflater = (LayoutInflater) mContext
       8:                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       9:         convertView = inflater.inflate(R.layout.list_item_icon_text, null);
      10:         holder = new ViewHolder();
      11:         holder.icon = (ImageView) convertView.findViewById(R.id.icon);
      12:         holder.text = (TextView) convertView.findViewById(R.id.text);
      13:         convertView.setTag(holder);
      14:     } else {
      15:         holder = (ViewHolder) convertView.getTag();
      16:     }
      17:     holder.icon.setImageResource(R.drawable.icon);
      18:     holder.text.setText(mData[position]);
      19:     return convertView;
      20: }
      21:
      22: static class ViewHolder {
      23:     ImageView icon;
      24:
      25:     TextView text;
      26: }

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

     

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

    以上是不建議的作法!!

     

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

     

    測試說明:

    你們能夠看到在getView的時候咱們經過log打印出position和當前系統時間。咱們經過初始化1000條數據到Adapter顯示到ListView,而後滾動到底部,計算出position=0和position=999時的時間間隔。

    測試機子:HTC Magic

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

  • device

    測試結果:

    兩種狀況在操做過程當中體驗明顯不一樣,在優化的狀況下流暢不少不少!

    一、優化建議測試結果:

    12-05 10:44:46.039: DEBUG/MyAdapter(13929): Position:0---1291517086043 
    12-05 10:44:46.069: DEBUG/MyAdapter(13929): Position:1---1291517086072 
    12-05 10:44:46.079: DEBUG/MyAdapter(13929): Position:2---1291517086085

    ……

    12-05 10:45:04.109: DEBUG/MyAdapter(13929): Position:997---1291517104112 
    12-05 10:45:04.129: DEBUG/MyAdapter(13929): Position:998---1291517104135 
    12-05 10:45:04.149: DEBUG/MyAdapter(13929): Position:999---1291517104154


    耗時:17967

    二、沒優化的測試結果

    12-05 10:51:42.569: DEBUG/MyAdapter(14131): Position:0---1291517502573 
    12-05 10:51:42.589: DEBUG/MyAdapter(14131): Position:1---1291517502590 
    12-05 10:51:42.609: DEBUG/MyAdapter(14131): Position:2---1291517502617

    ……

    12-05 10:52:07.079: DEBUG/MyAdapter(14131): Position:998---1291517527082 
    12-05 10:52:07.099: DEBUG/MyAdapter(14131): Position:999---1291517527108 

    耗時:24535

相關文章
相關標籤/搜索