在UI線程中可以非常容易的使用AsyncTask。 這個類允許在後臺操作和向主線程發送消息,而不必使用thread和handler。
AsyncTask是在Thread和Handler之間的一個幫助類,並不能構成一個一般的Threading框架。AsycTask適用於短時操作,最多幾秒鐘。如果那你想要有長時間的耗時操作,請使用java.util.concurrent包下的API,比如Executor, ThreadPoolExecutor 和 FutureTask.
異步任務是在後臺運行,並將後臺運行的結果發送到UI線程的操作。AsyncTask定義了三個泛型類型: Params, Progress , Result
有四個方法:onPreExecute, doInBackground, onProgressUpdate, onPostExcute
AsyncTask 被繼承,同時子類至少要重載doInbackground方法,通常也會重載onPostExcute方法。
官方實例如下:
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(url[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"); } }
一旦創建就可以非常容易的執行,調用方法:new DownloadFilesTask().excute(url1, url2, url3);
三個泛型參數的使用方法:
Params 執行任務時發送的參數
Progress:後臺運行的百分比
Result:後臺運行的結果
這三個參數並總是都需要的,如果不需要就用Void類型
異步任務被執行後要執行四步,每一步都對應一個回調方法,這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。
1. 該方法將在執行實際的後臺操作前被UI thread調用。可以在該方法中做一些準備工作,如在界面上顯示一個進度條。
2.doInBackground(Params...), 將在onPreExecute 方法執行後馬上在後臺線程中執行。它將主要負責執行那些很耗時的後臺計算工作。運行的結果必須被返回,並且會被傳遞到下一步。可以調用 publishProgress方法來更新實時的任務進度,這些值在onProgressUpdate方法中被髮送到UI線程。該方法是抽象方法,子類必須實現。
3.onProgressUpdate() 調用publishProgress方法後將會在UI線程中執行。當後臺任務執行時,這個方法可以用來展示任何用戶樣式的用戶界面。例如可以用來展示一個進度條或者是一個文本框
4.onPostExcute () doInBackground執行完成後在UI線程被觸發。doInBackground的返回值將會作爲它的參數
取消AsyncTask任務
隨時可以調用cancel(boolean)來取消任務。此方法調用後緊接着isCancelled()方法就會返回true,接着
就會在doInBackground(Object[])方法執行完後調用onCancelled(Object) ,而不是onPostExcute(Object) 。