[Android] AsyncTask-實作練習

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

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

 

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

JavaEE 企業Web程式設計 教你清楚瞭解企業專案程式開發