Android之AsyncTask詳解

異步任務(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í)行的返回值。

上面介紹的四個步驟的示意圖:

Image.png
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í)行會報錯伶授。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末断序,一起剝皮案震驚了整個濱河市流纹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违诗,老刑警劉巖漱凝,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诸迟,居然都是意外死亡茸炒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門阵苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扣典,“玉大人,你說我怎么就攤上這事慎玖≈猓” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵趁怔,是天一觀的道長湿硝。 經(jīng)常有香客問我,道長润努,這世上最難降的妖魔是什么关斜? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮铺浇,結(jié)果婚禮上痢畜,老公的妹妹穿的比我還像新娘。我一直安慰自己鳍侣,他們只是感情好丁稀,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倚聚,像睡著了一般线衫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惑折,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天授账,我揣著相機與錄音,去河邊找鬼惨驶。 笑死白热,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的粗卜。 我是一名探鬼主播屋确,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乍恐?” 一聲冷哼從身側(cè)響起评疗,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茵烈,沒想到半個月后百匆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡呜投,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年加匈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仑荐。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雕拼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粘招,到底是詐尸還是另有隱情啥寇,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布洒扎,位于F島的核電站辑甜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏袍冷。R本人自食惡果不足惜磷醋,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胡诗。 院中可真熱鬧邓线,春花似錦、人聲如沸煌恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽症虑。三九已至缩歪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谍憔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工主籍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留习贫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓千元,卻偏偏與公主長得像苫昌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幸海,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容