異步任務(wù)(AsyncTask)
AsyncTask我們通常會將耗時的操作放在單獨的線程執(zhí)行,避免其占用主線程而給用戶帶來不好的用戶體驗。但是在子線程中無法去操作主線程(UI線程),在子線程中操作UI線程會出現(xiàn)錯誤.
android提供了一個類Handler來在子線程中來更新UI線程,用發(fā)消息的機制更新UI界面,呈現(xiàn)給用戶時的任務(wù)操作總會啟動一些匿名的子線程,太多的子線程給系統(tǒng)帶來巨大的負擔(dān),隨之帶來一些性能問題。
因此android提供了一個工具類AsyncTask,顧名思義異步執(zhí)行任務(wù).不再需要子線程和Handler就可以完成異步操作并且刷新用戶界面。
AsyncTask
AsyncTask,異步任務(wù),可以簡單進行異步操作,并把執(zhí)行結(jié)果發(fā)布到UI主線程。AsyncTask是一個抽象類,它的內(nèi)部其實也是結(jié)合了Thread和Handler來實現(xiàn)異步線程操作,但是它形成了一個通用線程框架,更清晰簡單。
AsyncTask應(yīng)該被用于比較簡短的操作(最多幾秒鐘)。
如果需要保持長時間運行的線程,可以使用ThreadPooExecutor或者FutureTask,關(guān)于這兩個類的內(nèi)容,以后再介紹,本篇主要介紹AsyncTask。
AsyncTask被定義為一個操作,運行在一個后臺線程中,其結(jié)果被發(fā)布在UI線程上。
它的異步工作的參數(shù)與返回值被泛型的三個參數(shù)指定:Params、Progress、Result。
AsyncTask將經(jīng)歷4個步驟:onPreExecute、doInBackground、 onProgressUpdate、onPostExecute。下面詳細講解這三個參數(shù)與四個步驟:
三個泛型參數(shù):
- Params:被發(fā)送到執(zhí)行任務(wù)的參數(shù)類型。
- Progress:進度的類型,發(fā)送后臺的計算進度到UI線程類型。
- Result:異步任務(wù)的返回結(jié)果類型
一個異步任務(wù)將經(jīng)歷四個階段:
- onPreExecute():執(zhí)行在UI線程上調(diào)用執(zhí)行任務(wù)之前,一般用于設(shè)置任務(wù)。
- doInBackground(Params...):主要是用來執(zhí)行異步任務(wù)的耗時操作,可以在這個方法中通過publishProgress()方法發(fā)布進度信息,并在執(zhí)行完成之后,返回執(zhí)行結(jié)果。
- onProgreddUpdate(Progress...):在UI線程上接受doInBackground()傳遞過來的進度信息,并在UI線程上展示進度信息,它執(zhí)行的時機是不確定的。
- onPostExecute(Result):在UI線程上操作doInBackground()執(zhí)行的返回值。
上面介紹的四個步驟的示意圖:

AsyncTask取消任務(wù)
在程序的任何位置,都可以通過cancel(boolean)方法進行取消任務(wù),當(dāng)取消任務(wù)之后,會改變isCancelled()的返回值, 使其返回true。之后會調(diào)用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()的 返回結(jié)果。在運行中,可以經(jīng)常通過isCancelled()方法查看任務(wù)是否被取消。
AsyncTask的使用規(guī)則
使用AsyncTask必須遵循以下規(guī)則:
- AsyncTask必須聲明在UI線程上。
- AsyncTask必須在UI線程上實例化。
- 必須通過execute()方法執(zhí)行任務(wù)。
- 不可以直接調(diào)用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。
- 可以設(shè)置任務(wù)只執(zhí)行一次,如果企圖再次執(zhí)行會報錯。