Android AsyncTask 簡單用法
簡介
AsyncTask 是一個輕量級的異步處理類。使用是需繼承自該類。可以方便的執行異步任務并且在將進度顯示在UI上。
注意事項
-
AsyncTask只適合處理輕量級的任務即耗時幾秒或者幾十秒的任務。如果需要長時間執行后臺異步任務,可以查閱java.util.concurrent 包中的 Executor, ThreadPoolExecutor 以及 FutureTask等內容。
-
使用AsyncTask必須創建一個類繼承自AsyncTask,至少需要重寫doInBackground(params...) 方法執行具體的操作。一般會重寫onPostExecute(Result)方法用來執行后臺操作以及對后臺運行結果進行處理。
AsyncTask 執行的4個階段
-
step1
onPreExecute() 在主線程(UI線程)調用,用于開始任務前的初始化工作。例如顯示一個進度條。
-
step2
doInBackground(Params...) 后臺線程調用,onPreExecute() 執行完之后立即執行。用于執行耗時較長的操作。并且提供publishProgress(Progress...)方法用于顯示進度信息。
-
step3
onProgressUpdate (Progress...)在主線程(UI線程)調用,用于響應publishProgress(Progress...)方法。
-
step4
onPostExecute(Result) 在主線程調用,doInBackground(Params...)方法執行完后立即調用。Result是doInBackground(Params...)方法的返回值。
AsyncTask使用方法
- 構造函數 可以自定義public類型的構造函數,和普通的類沒有差別。
- AsyncTask每次使用必須new 一個對象,并且執行excute(Params...)方法。Params參數解釋見下文。
參數解釋
這三個參數會在類繼承時被指定,參數都使用泛型構造。
- Params 后臺線程所需要的參數列表,與構造類時所指定的第一個參數類型匹配。
- Progress 后臺線程執行過程中發送的進度信息, 與構造類時所指定的第二個參數類型匹配。
- Result 后臺線程執行完后的返回值, 與構造類時所指定的第三個參數類型匹配。
代碼示例(來自Android Developer)
- Class definition
private class DownloadFilesTask extends AsyncTask{
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));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
- Use
new DownloadFilesTask().execute(url1, url2, url3);