AsyncTask在Android程式設計中的使用率很高,特別以一小節建立一個獨立的專案進行練習,模擬三個需求並在此專案中只使用一個Activity,在其中設計三個繼承AsyncTask的內部類別,以符合模擬的三項需求。
專案準備
請先建立一個新專案,資訊如下:
1. 專案名稱:Async,套件com.tom.async
2. 版面與元件配置
版面與元件樹狀結構圖:

請將三個Button元件的權重屬性皆設定為1,再為TextView元件訂定id屬性為「info」,預覽與元件的屬性說明如下:

3. 事件處理
為三個Button元件分別設定onclick屬性為go1、go2與go3,如下圖:

並在MainActivity中實作方法,如下:

需求1-Job1Task類別
在畫面上按下GO1按鈕,工作5秒鐘,結束後在TextView中顯示「DONE」
1. 設計AsyncTask類別
在MainActivity中設計一個內部類別Job1Task,由需求進而設計規格如下:
class Job1Task extends AsyncTask<Void, Void, Void>{
…
}
因繼承了AsyncTask的原因,必須實作doInBackground方法,在類別定義處(顯示紅色警告行)按下「Alt+Enter」使用快速解決方案「Implement methods」可快速實作方法,如下圖:

2. 模擬耗時工作
在doInBackground方法中使用Thread.sleep(5000)讓這個工作停頓五秒,記得必須以「try…catch」處理(可按下Alt+Enter快速解決),程式碼如下:

3. 工作完成時的設計
因為需求中描述的,五秒結束後需改變TextView中的文字,因此再覆寫onPostExecute方法,按下「Ctrl+O」覆寫方法快速鍵,選擇欲覆寫的方法,如下圖:

在方法中設計符合需求的程式碼,如下:

最後在MainActivity的go1方法中產生Job1Task並執行execute方法,最後完成如下程式碼:
public void go1(View v){
new Job1Task().execute();
}
class Job1Task extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
TextView info = (TextView) findViewById(R.id.info);
info.setText("DONE");
}
}
4. 執行結果
執行後,按下GO1按鈕,等待五秒後,TextView文字會改變為DONE,如下圖:

本階段完成的原始碼(github):
https://github.com/hanktom/projects16/commit/018fb634cec4edd95bb1fed2ba02e339176a4e6c
需求2-Job2Task類別
在畫面上按下GO2按鈕,工作n杪後,結束後在TextView中顯示「DONE」
設計Job2Task類別時,傳入值宣告為Integer,代表整數,如下:

其他設計與Job1類似,但在執行時呼叫execute方法應按照規範傳入整數值,完整程式碼如下:

本階段完成的原始碼(github):
https://github.com/hanktom/projects16/commit/b8d9b3eaaacaf6d79ac45677d62fe91a7230cb88
需求3-Job3Task類別
在畫面上按下GO3按鈕,與需求2相同,但需每秒更新秒數到TextView
本例在工作執行過程中需要回報秒數,設計Job3Task類別時的第二個參數應宣告為Integer,如下:

在覆寫方法時,應覆寫onPostExecute與onProgressUpdate兩個方法,如下:

完成程式碼實作如下:

第85到92行使用for迴圈,由傳入值遞減到1,第88行每次迴圈執行即停頓1秒,重點在第86行,呼叫publishProgress方法,會自動呼叫第96行的onProgressUpdate方法,此方法負責每秒更新TextView中的文字。在第80行產生Job3Task並傳入6至類別中執行。
執行時,TextView文字每秒會更新,如下圖:

最後,TextView顯示DONE,如下圖:
本階段完成的原始碼(github):
https://github.com/hanktom/projects16/commit/dc040b7cb208cb612f8e8b927003d1de3c32e6cc