Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android 中文 API (101) —— AsyncTask

Android 中文 API (101) —— AsyncTask

編輯:Android開發實例

前言

  本章內容是android.os.AsyncTask,版本為Android 2.3 r1,翻譯來自"0_1"。
 

 

 

正文

  一、結構

public abstract class AsyncTask extends Object

        

java.lang.Object

android.os.AsyncTask<Params, Progress, Result>

 

  二、類概述

  AsyncTask能夠適當地、簡單地用於 UI線程。 這個類不需要操作線程(Thread)就可以完成後台操作將結果返回UI。

  異步任務的定義是一個在後台線程上運行,其結果是在 UI線程上發布的計算。 異步任務被定義成三種泛型類型: Params,Progress和 Result;和四個步驟: begin , doInBackground,processProgress 和end。

 

  三、用法

    AysncTask必須被繼承使用。子類至少覆蓋一個方法 (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");
     }
 }

     一旦創建,一個任務執行起來就非常簡單:

 new DownloadFilesTask().execute(url1, url2, url3);

 

  四、AsyncTask的泛型類型
 

  這三個類型被用於一個異步任務,如下:

  1. Params,啟動任務執行的輸入參數

  2. Progress,後台任務執行的百分比

  3. Result,後台計算的結果類型

  在一個異步任務裡,不是所有的類型總被用。假如一個類型不被使用,可以簡單地使用 Void類型:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }


 

  五、4個步驟
 

    當一個異步任務被執行,任務經過四各步驟:

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

    2.doInBackground(Params...),後台線程執行onPreExecute()完後立即調用,這步被用於執行較長時間的後台計算。異步任務的參數也被傳到這步。計算的結果必須在這步返回,將傳回到上一步。在執行過程中可以調用publishProgress(Progress...)來更新任務的進度。

    3.onProgressUpdate(Progress...),一次呼叫 publishProgress(Progress...)後調用 UI線程。執行時間是不確定的。這個方法用於當後台計算還在進行時在用戶界面顯示進度。例如:這個方法可以被用於一個進度條動畫或在文本域顯示記錄。

    4.onPostExecute(Result), 當後台計算結束時,調用 UI線程。後台計算結果作為一個參數傳遞到這步。

 

  六、線程規則
 

  有一些線程規則必須去遵守,這個類才會正確的工作:

    任務實例必須創建在 UI線程

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

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

    這個任務只執行一次(如果執行第二次將會拋出異常)

 

  七、內部類

      enum       AsyncTask.Status  

  表示任務的當前狀態

 

  八、構造函數

        public AsyncTask ()

  創建一個新的異步任務。這個構造函數必須在UI線程上調用。

 

  九、公共方法

  public final boolean cancel (boolean mayInterruptIfRunning)

  嘗試取消這個任務的執行,如果這個任務已經結束或者已經取消或者不能被取消或者某些其他原因,那麼將導致這個操作失敗,當調用此方法時,此方法執行成功並且這個任務還沒有執行,那麼此任務將不再執行。如果任務已經開始,這時執行此操作傳入的參數mayInterruptIfRunning為true,執行此任務的線程將嘗試中斷該任務。

  參數

  mayInterruptIfRunning 如果為true則正在執行的線程將會中斷,如果false,則會允許正在執行的任務線程執行完畢。

  返回值

                       如果此任務不能取消返回false,如果已經正常的執行完畢,返回true

  參見

            isCancelled()

      onCancelled()

                  

  public final AsyncTask<Params, Progress, Result> execute (Params... params)

  用指定的參數來執行此任務,這個方法將會返回此任務本身,所以調用者可以擁有此任務的引用。此方法必須在UI線程中調用

  參數

  params  任務參數

  返回值

  AsyncTask的實例

  異常

  IllegalStateException       如果getStatus()返回的是RUNNING或者FINISHED

 

  public final Result get ()

  等待計算結束並返回結果

  返回值

  計算結果

  異常

  CancellationException    如果計算取消

  ExecutionException         如果計算拋出異常

  InterruptedException     當等待時當前線程拋出異常

 

  public final Result get (long timeout, TimeUnit unit)

  等待計算結束並返回結果,最長等待時間為:timeOut(超時時間).

  參數

  timeout 計算等待超時時間

  unit          超時的時間單位

  返回值

  計算結果

  異常

  CancellationException    如果計算取消

  ExecutionException         如果計算拋出異常

  InterruptedException     當等待時當前線程拋出異常

  TimeoutException 等待時間超時

 

  public final AsyncTask.Status getStatus ()

  獲得任務的當前狀態

  返回值

               當前狀態

 

  public final boolean isCancelled ()

  如果在任務正常結束之前取消任務成功則返回true,否則返回false

  返回值

                            如果任務正常結束之前取消任務成功返回true。

                  參見

                            cancel(boolean)

 

  十、受保護方法
 

           protected abstract Result doInBackground (Params... params)

  覆蓋此方法在後台線程執行計算,此方法中的參數是此任務的execute(Params...)方法的調用這傳遞的參數,此方法可以調用publishProgress(Progress...)UI線程中來更新數據

  參數

  params  此任務的參數

  返回值

  返回一個由此任務子類定義的結果 Result

                 參見

                       onPreExecute()

                       onPostExecute(Result)

                       publishProgress(Progress...)

 

  protected void onCancelled ()

  此方法在UI線程中當cancel(boolean) 被調用後調用

  參見

                       cancel(boolean)

                       isCancelled()

 

  protected void onPostExecute (Result result)

  此方法在UI線程中doInBackground(Params...)。方法調用之後調用,此方法中的參數的值是doInBackground(Params...)的返回值或者當此任務已經被取消或有異常發生時此參數值為空null

  參數

  result      由doInBackground(Params...)計算出的操作的結果。

  參見

onPreExecute()   

                      doInBackground(Params...)

 

  protected void onPreExecute ()

  在方法doInBackground(Params...)調用之前調用

  參見

                       onPostExecute(Result)

                        doInBackground(Params...)

 

  protected void onProgressUpdate (Progress... values)

  該方法在UI線程中publishProgress(Progress...)被調用之後調用,該方法中的參數values是已經被傳遞到publishProgress(Progress...)中的參數

             參數

  values     進度表示值

  參見

              publishProgress(Progress...)

                       doInBackground(Params...)

 

  protected final void publishProgress (Progress... values)

  當調用doInBackground(Params...)在後台執行計算時會調用該方法,每當在UI線程中調用此方法時將觸發onProgressUpdate(Progress...)方法的執行

  參數

  values     將進度值更新到UI

  參見

                       onProgressUpdate(Progress...)

                       doInBackground(Params...)

 

  十一、補充
 

           文章精選

                   Android AsyncTask理解

                   TabActivity下在AsyncTask中使用ProgressDialog存在問題的解決方法

                   小心,AsyncTask 不是萬能的[blogspot]

 

  十二、公告

    內部類、內部接口由於內容較少均不再單獨發布。

 

結束

  隨著春節的結束,翻譯組工作重新回到正軌,感謝大家的關注與支持!

 

——————————————————————————————————————————

AsyncTask.Status

  一、結構

public static final enum AsyncTask.Status extends Enum<E extends Enum<E>>

        

java.lang.Object

java.lang.Enum<E extends java.lang.Enum<E>>

         android.os.AsyncTask.Status

 

  二、類概述

    標志任務的當前狀態,每個狀態在任務的生命周期中只會出現一次。

 

  三、枚舉值

  public static final AsyncTask.Status FINISHED

  標志onPostExecute(Result)方法已經結束

 

  public static final AsyncTask.Status PENDING

  標志任務還沒有執行

 

  public static final AsyncTask.Status RUNNING

  標志任務正在執行

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved