Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android官方開發文檔Training系列課程中文版:布局性能優化之ListView的優化

Android官方開發文檔Training系列課程中文版:布局性能優化之ListView的優化

編輯:關於Android編程

原文地址:http://android.xsoftlab.net/training/improving-layouts/smooth-scrolling.html

想要讓ListView滑動流暢的關鍵所在是減輕主線程的負擔。要確保任何的磁盤訪問、網絡訪問、或者SQL訪問都是在單獨的線程中執行的。如果要測試APP的狀態,可以開啟StrictMode。

使用後台線程

使用工作線程可以使UI線程將所有的注意力都集中在UI的繪制上。在很多情況下,使用AsyncTask所提供的功能就可以在工作線程中處理耗時任務。AsyncTask會自動的將execute()發起的請求排隊,並依次執行。這意味著你不要自己創建線程池。

在下面的示例代碼中,AsyncTask被用來加載一張圖像,並在加載結束後自動的將其渲染到UI上。它還在圖像加載時展示了一個旋轉的進度條。

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask() {
    private ViewHolder v;
    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }
    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);

從Android 3.0開始,AsyncTask提供了一項新特性:可以將任務運行在多核處理器上。你可以使用executeOnExecutor()方法發起執行請求,這樣多個請求就可以同時進行,同時進行的任務數量取決於CPU的核心數量。

使用View Holder持有View對象

在滑動ListView時,代碼可能會頻繁的調用findViewById(),這會降低性能。就算是Adapter將已經加載過的View返回,但是在復用時還是需要去查詢這些View來更新它們。杜絕重復使用findViewById()的方法就是使用”View Holder”設計模式。

ViewHolder對象將每個View組件存儲於布局容器的tag屬性內,所以你可以快速訪問它們而不需要每次都去查詢。首先,你需要創建一個類來持有已加載的View:

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}

然後對ViewHolder的成員屬性賦值,然後將其存放在布局容器內:

ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);

那麼現在就可以很方便的對這些View組件進行訪問,而不再需要對它們單獨進行查詢,如此便可以節省出寶貴的CPU資源。

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