Android AsyncTask-實作練習

作者 | 2016-03-26

如果你已經瞭解AsyncTask類別的實作要領,現在是時候建立一個專門練習的專案,進行實際練習。若還未瞭解,可參考:

先瞭解:[Android] AsyncTask-耗時工作設計

AsyncTask在Android程式設計中的使用率很高,特別以一小節建立一個獨立的專案進行練習,模擬三個需求並在此專案中只使用一個Activity,在其中設計三個繼承AsyncTask的內部類別,以符合模擬的三項需求。

專案準備

請先建立一個新專案,資訊如下:

1. 專案名稱:Async,套件com.tom.async

2. 版面與元件配置

版面與元件樹狀結構圖:

A4276

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

A4278

3. 事件處理

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

A4279

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

A4277

需求1-Job1Task類別

在畫面上按下GO1按鈕,工作5秒鐘,結束後在TextView中顯示「DONE」

1. 設計AsyncTask類別

在MainActivity中設計一個內部類別Job1Task,由需求進而設計規格如下:


因繼承了AsyncTask的原因,必須實作doInBackground方法,在類別定義處(顯示紅色警告行)按下「Alt+Enter」使用快速解決方案「Implement methods」可快速實作方法,如下圖:

A4280

2.  模擬耗時工作

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

A4281

3.  工作完成時的設計

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

A4282

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

A4283

最後在MainActivity的go1方法中產生Job1Task並執行execute方法,最後完成如下程式碼:

4.  執行結果

執行後,按下GO1按鈕,等待五秒後,TextView文字會改變為DONE,如下圖:

A4285

本階段完成的原始碼(github):

https://github.com/hanktom/projects16/commit/018fb634cec4edd95bb1fed2ba02e339176a4e6c

需求2-Job2Task類別

在畫面上按下GO2按鈕,工作n杪後,結束後在TextView中顯示「DONE」

設計Job2Task類別時,傳入值宣告為Integer,代表整數,如下:

A4290

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

A4286

本階段完成的原始碼(github):

https://github.com/hanktom/projects16/commit/b8d9b3eaaacaf6d79ac45677d62fe91a7230cb88

需求3-Job3Task類別

在畫面上按下GO3按鈕,與需求2相同,但需每秒更新秒數到TextView

本例在工作執行過程中需要回報秒數,設計Job3Task類別時的第二個參數應宣告為Integer,如下:

A4291

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

A4287

完成程式碼實作如下:

A4292

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

執行時,TextView文字每秒會更新,如下圖:

A4288

最後,TextView顯示DONE,如下圖:

A4289

本階段完成的原始碼(github):

https://github.com/hanktom/projects16/commit/dc040b7cb208cb612f8e8b927003d1de3c32e6cc

相關文章:

Category: Android 標籤:,

關於 Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 ,為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

2 thoughts on “Android AsyncTask-實作練習

  1. 沈冠宇

    Hank老師 你好
    我在你的Android AsyncTask-耗時工作設計、實作練習裡,發現程式碼裡的內容有出現網頁語法,可能是在撰寫網頁時有些不注意。
    另外老師的講解很清楚!上網查的資料基本上都是大陸、外國的資源居多,台灣現在很少這種講解android程式這麼清楚,希望老師能繼續寫!

    回覆
    1. Hank Tom 文章作者

      謝謝你的提醒,程式碼中的錯誤網頁標籤已更正。這幾篇文章是我認為對基礎學習比較重要的,感謝你寶貴的回饋,這都是繼續發表文章的動力來源。

      回覆

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *