AsyncTask 的執行分為四個步驟,每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。
* onPreExecute() 當任務執行之前開始調用此方法,可以在這里顯示進度對話框。
* doInBackground(Params...) 此方法在后台線程 執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress...)來更新任務的進度。
* onProgressUpdate(Progress...) 此方法在主線程 執行,用於顯示任務執行的進度。
* onPostExecute(Result) 此方法在主線程 執行,任務執行的結果作為此方法的參數返回。
- AsyncTask的三個泛型參數說明(三個參數可以是任何類型)
class BitmapWorkTask extends AsyncTask<Integer,Integer,Bitmap>{...}
- 第一個參數:傳入doInBackground()方法的參數類型
- 第二個參數:傳入onProgressUpdate()方法的參數類型
- 第三個參數:傳入onPostExecute()方法的參數類型,也是doInBackground()方法返回的類型
@Override protected Bitmap doInBackground(Integer... integers) { data = integers[0]; return decodeSampleBitmapFromResources(getResources(),data,100,100); } @Override protected void onPostExecute(Bitmap bitmap) { if (weakReference != null && bitmap != null) { final ImageView imageView = (ImageView) weakReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); } } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); }
為了正確的使用AsyncTask類,以下是幾條必須遵守的准則:
1) Task的實例必須在UI thread中創建
2) execute方法必須在UI thread中調用
3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法
4) 該task只能被執行一次,否則多次調用時將會出現異常
doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個為doInBackground接受的參數,第二個為顯示進度的參數,第第三個為doInBackground返回和onPostExecute傳入的參數。
BitmapWorkTask task = new BitmapWorkTask(imageView); task.execute(resId);
然后基本就完成了!