翻譯AsyncTask官方文檔

在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) 。

爲了確保任務儘快取消,你應該儘可能的在doInBackground(Object[])中定期檢查isCancelled的返回值()(例如在一個循環)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章