[翻譯]android中如何使得ListView滑動流暢

本文翻譯的是官網的這篇文章

前言

保證LitView滑動流暢的關鍵在於:保持應用程序的主線程(既UI線程)不運行復雜的進程。確定任何要硬盤讀取、網絡讀取或者數據庫讀取的行爲在一個獨立的線程中進行。你可以激活StrictMode模式來測試你的APP的狀態。

1.使用後臺線程

使用一個後臺線程(工作線程)可以減輕主線程的壓力,這樣主線程就可以專注UI的繪製。在很多的解決辦法中,AsyncTask提供了一種簡單的方式實現在主線程之外完成耗時任務。AsyncTask 自動排列並且順序執行所有的execute()請求。這些行爲是在一個全局唯一的進程裏面進行的,所以你不用去創建自己的線程池。
下面是一個簡單的例子,AsyncTask用來在後臺線程中下載圖片,並在下載完成後應用到UI中。當下載的時候也在展示圖片的地方顯示了一個進度條。

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    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(API 11)開始,AsyncTask有了一個額外的特性,這個特性使得AsyncTask能夠在多處理器內核中運行。用executeOnExecutor()方法替代execute()方法可以在多個內核中同時執行多個請求。

2.用View Holder保存View對象

在滑動ListView的過程中,你的代碼可能頻繁的調用findViewById(),這降低性能。甚至是在Adapter返回已經填充好了的View的時候,仍然需要找到各個組件並且更新他們。一種循環使用findViewByIdea()的方法是使用“view holder”設計模式。
ViewHolder對象在佈局的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,而不需要一個一個查找了,節省有限的處理器週期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章