天天看點

Android基礎複習之AsyncTask

Android基礎複習之AsyncTask

作者:朱紅喜

1.概述

AsyncTask

是一個抽象類,必須建立一個子類去實作,實際也由異步消息機制封裝得來,它的類結構為

public abstract class AsyncTask<Params, Progress, Result> { 
 ... 
}

// 類中參數為3種泛型類型
// 整體作用:控制AsyncTask子類執行線程任務時各個階段的傳回類型
// 具體說明:
    // a. Params:開始異步任務執行時傳入的參數類型,對應excute()中傳遞的參數
    // b. Progress:異步任務執行過程中,傳回下載下傳進度值的類型
    // c. Result:異步任務執行完成後,傳回的結果類型,與doInBackground()的傳回值類型保持一緻
// 注:
    // a. 使用時并不是所有類型都被使用
    // b. 若無被使用,可用java.lang.Void類型代替
    // c. 若有不同業務,需額外再寫1個AsyncTask的子類
}
           

2.基本方法

  • onPreExecute()

    :在任務開始的時候調用,用于界面上的一些初始化操作
  • doInBackground()

    :這個方法的會在一個子線程中進行,在這裡處理耗時的操作,并通過return傳回結果,如果第三個參數傳進來為void,則傳回空。
  • onProgressUpdate(Progress...)

    :在背景任務中調用了publishProgress()方法後,這個方法就會被調用。可以使用方法所帶的進度參數更新UI
  • onPostExecute(Result)

    :當背景任務完成,并通過return傳回結果後這個方法會被調用,傳回的資料可以在這裡被調用,更新UI。同時這個可以做完成後的收尾工作。

3.使用步驟(引用于Carson大佬)

```java
/**
  * 步驟1:建立AsyncTask子類
  * 注: 
  *   a. 繼承AsyncTask類
  *   b. 為3個泛型參數指定類型;若不使用,可用java.lang.Void類型代替
  *   c. 根據需求,在AsyncTask子類内實作核心方法
  */

  private class MyTask extends AsyncTask<Params, Progress, Result> {

        ....

      // 方法1:onPreExecute()
      // 作用:執行 線程任務前的操作
      // 注:根據需求複寫
      @Override
      protected void onPreExecute() {
           ...
        }

      // 方法2:doInBackground()
      // 作用:接收輸入參數、執行任務中的耗時操作、傳回 線程任務執行的結果
      // 注:必須複寫,進而自定義線程任務
      @Override
      protected String doInBackground(String... params) {

            ...// 自定義的線程任務

            // 可調用publishProgress()顯示進度, 之後将執行onProgressUpdate()
             publishProgress(count);
              
         }

      // 方法3:onProgressUpdate()
      // 作用:在主線程 顯示線程任務執行的進度
      // 注:根據需求複寫
      @Override
      protected void onProgressUpdate(Integer... progresses) {
            ...

        }

      // 方法4:onPostExecute()
      // 作用:接收線程任務執行結果、将執行結果顯示到UI元件
      // 注:必須複寫,進而自定義UI操作
      @Override
      protected void onPostExecute(String result) {

         ...// UI操作

        }

      // 方法5:onCancelled()
      // 作用:将異步任務設定為:取消狀态
      @Override
        protected void onCancelled() {
        ...
        }
  }

/**
  * 步驟2:建立AsyncTask子類的執行個體對象(即 任務執行個體)
  * 注:AsyncTask子類的執行個體必須在UI線程中建立
  */
  MyTask mTask = new MyTask();

/**
  * 步驟3:手動調用execute(Params... params) 進而執行異步線程任務
  * 注:
  *    a. 必須在UI線程中調用
  *    b. 同一個AsyncTask執行個體對象隻能執行1次,若執行第2次将會抛出異常
  *    c. 執行任務中,系統會自動調用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() 
  *    d. 不能手動調用上述方法
  */
  mTask.execute();
           

4.存在的問題

  • 1.記得在活動或者fragment的

    onDestroy()

    方法中調用

    cancel(boolean)

    ,取消異步任務
  • 2.記憶體洩漏->将其聲明為靜态内部類