流暢滑動ListView的關鍵是保持應用程序的主線程(UI線程)從免於繁重處理。確保你的任何硬盤訪問,網絡訪問或者SQL訪問在一個單獨的線程中。為了測試你的應用個程序的狀態,你能啟動StrictMode。
使用後台線程
——————————————————————————————————————————————————————————————
使用一個後台線程(“工作線程”),從主線程中移除,所以它能專注於繪制UI。在許多情況下,使用AsyTask提供的簡單方式,在主線程之外來執行你的工作。AsyncTask自動隊列保存所有execute()請求,並連續的執行它們。這個行為對於一個進程是全局的,並且意味著你不需要擔心創建你自己的線程池。
在下面的這個示例代碼中,AsyncTask是被用於在後台線程中下載圖片,然後一旦完成將它們顯示到UI中。當它們在下載的時候,它也在圖片的位置顯示了一個進度條。
[java]
// 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);<span style="font-family:Arial,sans-serif; font-size:10pt; background-color:transparent; color:windowtext"> </span>
從Android3.0開始(API level11),在AsyncTask中有一個額外的功能,這麼你能啟用它來運行在多處理器核心中。替代調用execute()方法,你能調用executeOnExecutor()方法,然後基於可用的核數,多個請求能在同一時間上運行。
在View Holder中保存視圖
——————————————————————————————————————————————————————————————
當滑動ListView的時候,你的代碼應該會經常調用findViewById()方法,它會減緩性能。即使Adapter返回一個在填充視圖循環使用,你一直需要尋找這個元素並更新他們。一種不錯的使用findViewById()方法的方式,是使用“view holder”設計模型。
ViewHolder對象存放了布局標記區域的視圖組件,所以你能立刻訪問它們,不需要重復的尋找它們。首先,你需要創建一個類來保存你需要的視圖組。例如:
[java]
static class ViewHolder {
TextView text;
TextView timestamp;
ImageView icon;
ProgressBar progress;
int position;
}
然後填充這個ViewHolder,並在這個布局中保存它。
[java]
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);
現在你能快速訪問每個視圖,不需要查找,節省寶貴的處理器時間。