Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發——09Google I/O之讓Android UI性能更高效(1)

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

編輯:Android開發實例

一、前言

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

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

  • Adapter優化
  • 背景和圖片優化
  • 繪圖優化
  • 視圖和布局優化
  • 內存分配優化

    二、Adapter優化

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

    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一直滾動底部。:-)
  • 測試結果:

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

    1、優化建議測試結果:

    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

    2、沒優化的測試結果

    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

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

    OK,歡迎大家交流學習,Gtalk:[email protected]

    示例代碼: GoogleIO示例代碼

轉自:http://www.cnblogs.com/halzhang/archive/2010/12/05/1896791.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved