Android中AsyncTask類解析 – Android移動開發技術文章_手機開發 Android移動開發教學課程

AsyncTask暫且翻譯為異步任務

概述:
        AsyncTask使UI線程的使用變得恰當和簡單。這個類允許在後臺執行操作並且在UI線程呈現處理的結果,無需操作線程。

一個異步任務是指在後臺運行的線程,其運行結果在UI線程呈現。

一個異步任務由3個泛型和4個步驟定義完成。

用法:

  一個AsyncTask必須要被繼承才能使用。這個子類必須重寫doInBackground(Params…)方法,通常還要重寫onPostExecute(Result)方法。

下面是一個子類的列子,來自官方文檔:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL… urls) { 
        int count = urls.length; 
        long totalSize = 0; 
        for (int i = 0; i < count; i++) { 
            totalSize += Downloader.downloadFile(urls[i]); 
            publishProgress((int) ((i / (float) count) * 100)); 
        } 
        return totalSize; 
    } 
 
    protected void onProgressUpdate(Integer… progress) { 
        setProgressPercent(progress[0]); 
    } 
 
    protected void onPostExecute(Long result) { 
        showDialog("Downloaded " + result + " bytes"); 
    } 

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL… urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer… progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
 一旦被創建,一個任務可以很簡單地執行:

 

new DownloadFilesTask().execute(url1, url2, url3); 
 new DownloadFilesTask().execute(url1, url2, url3);
 
AsyncTask的泛型:

        這3種類型使用如下

1.Params,任務執行時輸入的參數類型

2.Progress,後臺任務執行的百分比進度

3.Result,後臺任務執行後的返回結果,比如String

AsyncTask執行的4個步驟:
        一個異步任務執行時,經歷如下4個步驟:

1. onPreExecute() ,當任務被執行後立即被UI線程調用。這一步通常用來設置這個任務,比如在用戶界面顯示一個進度條。

2.doInBackground(Params…) 在onPreExeecte執行完後立即在後臺運行。這一步通常用來執行後臺的耗時操作。任務的參數會傳遞到這一步來,其運算結果被返回並傳遞給最後一步。在這一步也可以調用publishProgress(Progress…)來更新任務進度。這些值會在onProgressUpdate(Progress…)時被UI線程公佈出來。

3.onProgressUpdate(Progress).在publisProgress(Progress…)被調用後由UI線程喚起,其執行時間是不確定的。這個方法用來在用戶界面中顯示後臺操作的執行進度。比如,它可以用來動態顯示一個進度條或者在文本框顯示日志。

4.OnPostExecute(Result) 在後臺操作執行完後由UI線程調用。在這一步,後臺操作運行的結果會被當做一個參數傳遞給它,即Result。

取消一個任務:
        通過調用cancel(boolean),一個任務可以在任意時刻被取消。調用這個方法會導致後面調用isCancelled()返回true。調用這個方法後,在doInBackground(Params…)返回時將不再調用onPostExecute(object)而是調用onCancelled(object).為瞭盡快取消一個任務,你必須周期性地在doInBackgrouond(object)中檢查isCancelled()的返回值。如果可能的話,比如可以在一個循環內這麼幹。

註意事項:
    任務的實例必須在UI線程創建

    execute(Params…)必須在UI線程調用

    不要手動調用onPreExecute(),onPostExecute(Result),doInBackgrouond(Params…),onProgressUpdate(Progress..)

     任務隻會執行一次,如果嘗試執行第二次則會拋出一個異常。

 摘自 厚積而薄發,水到而渠成

 

發佈留言