異步任務(wù)(AsyncTask)
AsyncTask我們通常會將耗時的操作放在單獨的線程執(zhí)行华坦,避免其占用主線程而給用戶帶來不好的用戶體驗钟些。但是在子線程中無法去操作主線程(UI線程)脓钾,在子線程中操作UI線程會出現(xiàn)錯誤.
android提供了一個類Handler來在子線程中來更新UI線程饶囚,用發(fā)消息的機制更新UI界面,呈現(xiàn)給用戶時的任務(wù)操作總會啟動一些匿名的子線程仅淑,太多的子線程給系統(tǒng)帶來巨大的負擔,隨之帶來一些性能問題胸哥。
因此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ù)老玛,當取消任務(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í)行會報錯伶授。