您好,登錄后才能下訂單哦!
簡介
Android給我們提供了一種輕量級的異步任務類AsyncTask。該類中實現異步操作,并提供接口反饋當前異步執行結果及進度,這些接口中有直接運行在主線程中的(如 onPostExecute,onPreExecute等)。
AsyncTask可以輕松正確的使用UI線程,這個類允許你在后臺操作,并且不需要使用threads或者handler將結果發布到UI線程。
AsyncTask設計之初就是輔助Thread和Handler的,并且不會生成線程。AsyncTask應該被用于短時間內的操作(最多幾秒鐘),如果你想要長時間保持線程運行,請使用Executor或者ThreadPoolExecutor或者FutureTask。
AsyncTask在后臺運行任務,在UI線程發布結果,定義三個參數,Params, Progress和Result,執行四個步驟,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。
使用方法
AsyncTask必須被繼承來使用。子類必須實現至少一個方法(ddoInBackground(Params…))
,還有一個最常用的方法(onPostExecute(Result)
。
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(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"); } }
啟動異步任務:
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTasks的范型參數
異步任務使用的參數是:
這三個參數不一定非要指定,可以使用Void來傳入空值。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
4個步驟
onPreExecute()
,在應用程序執行前在UI線程上調用。這步通常被用來準備任務開始,例如顯示一個進度條。doInBackground(Params…)
,在onPreExecute()
方法被調用后立即執行此方法,用來執行長時間的任務。publishProgress(Progress...)
來發布進度,這些值時在UI線程中發布的,在onProgressUpdate(Progress...)
接收。onProgressUpdate(Progress…)
, 在publishProgress(Progress...)
方法調用后在UI線程調用此方法。執行時間未定義。該方法用于在后臺計算仍在執行時,用戶界面中顯示的進度。例如,它可以用于對進度條進行動畫處理或在文本字段中顯示日志。onPostExecute(Result)
,在后臺計算完成后在UI線程上調用。 后臺計算的結果作為參數傳遞給該步驟。取消異步任務
任何時候都可以通過調用cancel(boolean)
方法來取消任務。
調用此方法將導致對isCancelled()
的后續調用返回true。
調用此方法后,onCancelled(Object)
,而不調用onPostExecute(Object)
為了盡可能快地取消任務,應該始終從doInBackground(Object [])
中定期檢查isCancelled()
的返回值(如果可能的話)。
線程規則
execute(Params …)
onPreExecute()
,onPostExecute(Result)
,doInBackground(Params …)
,onProgressUpdate(Progress …)
。內存監控
AsyncTask保證所有回調調用都是同步的,使得以下操作在沒有顯式同步的情況下是安全的。
onPreExecute()
中設置成員字段,并在doInBackground(Params …)
中引用它們。doInBackground(Params …)
中設置成員字段,并在onProgressUpdate(Progress …)
和onPostExecute(Result)
中引用它們。執行順序
首次引入時,AsyncTasks在單個后臺線程上串行執行。
從DONUT開始,這被更改為一個允許多個任務并行操作的線程池。
從HONEYCOMB開始,任務在單個線程上執行,以避免并行執行引起的常見應用程序錯誤。
如果真的需要并行執行,則可以使用THREAD_POOL_EXECUTOR調用executeOnExecutor(java.util.concurrent.Executor,Object [])
。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。