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()
-
:這個方法的會在一個子線程中進行,在這裡處理耗時的操作,并通過return傳回結果,如果第三個參數傳進來為void,則傳回空。doInBackground()
-
:在背景任務中調用了publishProgress()方法後,這個方法就會被調用。可以使用方法所帶的進度參數更新UIonProgressUpdate(Progress...)
-
:當背景任務完成,并通過return傳回結果後這個方法會被調用,傳回的資料可以在這裡被調用,更新UI。同時這個可以做完成後的收尾工作。onPostExecute(Result)
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.記憶體洩漏->将其聲明為靜态内部類