AsyncTask

AsyncTask類原型

public abstract class AsyncTask<Params, Progress, Result>
  • Params:傳遞給AsyncTask的類型阅仔,作為doInBackground的參數(shù)類型
  • Progress:作為onProgressUpdate和publishProgress的參數(shù)類型
  • Result:由doInBackground返回谍椅,作為onPostExecute的參數(shù)類型

使用規(guī)則

  • 該類實例必須在UI線程中創(chuàng)建
  • execute方法必須在UI線程中調用
  • 一個任務實例只能執(zhí)行一次

執(zhí)行流程

  1. onPreExecute:在UI線程中執(zhí)行,一般用于任務執(zhí)行前初始化UI铆农,如顯示進度條對話框等
  2. doInBackground:在后臺執(zhí)行,期間可以調用publishProgress來更新進度條等內(nèi)容
  3. onProgressUpdate:當publishProgress調用時在UI線程中執(zhí)行,可更新進度條或顯示文本等信息
  4. onPostExecute:在UI線程中執(zhí)行墩剖,可以利用返回的結果更新UI猴凹,或者關閉進度條對話框等。
  5. onCanceled: 該方法運行在UI線程中岭皂,可以在方法中關閉進度條對話框等郊霎。

任務的取消

可以調用cancel取消任務,之后isCancelled會返回true爷绘。
取消任務后书劝,doInBackground返回后,onPostExecute不再執(zhí)行土至,而是onCancelled執(zhí)行购对。
為了盡快取消任務,應該在doInBackground中調用isCancelled檢查任務是否取消陶因,以采取相應的行動骡苞。
在編寫doInBackground方法時,應該不時地檢查isCanceled的返回值楷扬,如果返回true解幽,應該停止執(zhí)行任務。
在onPostExecute中烘苹,應該調用isCanceled檢測任務是否已經(jīng)被取消躲株。

另外,在調用execute執(zhí)行后螟加,應該注意它的取消操作徘溢。
例如在Activiy中,應該在Activity不可見時(onStop方法)取消操作捆探。

當配置變化時

當配置變化時然爆,如果進行了合適的取消,當Activity或Fragment重新啟動時黍图,會導致任務重新開始曾雕。

為了避免在配置變化時重新開始,可以把AsyncTask保存在Fragment中助被,當配置變化時剖张,使用Fragment保證任務不會中斷。

如果在執(zhí)行任務時揩环,同時顯示了加載對話框搔弄,可以在配置變化時,dismiss對話框丰滑,當重新開始時顾犹,再顯示對話框。

http://blog.csdn.net/lmj623565791/article/details/37936275

AsyncTask的適用場景和內(nèi)存泄漏

AsyncTask應該用于短時間的任務。
如果作用于長時間的任務炫刷,且是內(nèi)部類擎宝,那么保存了Activity的引用,會導致Activity不會被垃圾回收浑玛∩苌辏可以通過靜態(tài)類來解決。
同時顾彰,在更新UI時极阅,會拋出異常【醒耄可以通過實現(xiàn)合適的取消機制來解決涂屁。

實現(xiàn)原理

為了實現(xiàn)可取消的操作书在,內(nèi)部使用了FutureTask類灰伟。
同時,內(nèi)部使用了線程池儒旬,默認情況下栏账,只有一個任務在執(zhí)行,其他任務會入隊列等待執(zhí)行栈源〉簿簦可以通過構造方法,傳遞自定義的Executor來并行執(zhí)行甚垦。
-在Android 3.0之前茶鹃,線程池可以并行執(zhí)行5個任務,最大為128.
在Android 3.0及其之后艰亮,默認線程池為串行執(zhí)行闭翩。
最后,為了能夠更新UI迄埃,使用可擴展了Handler的靜態(tài)內(nèi)部類疗韵,它的Looper使用的是UI線程的。所以侄非,可以發(fā)送消息給該Handler以更新進度條和UI等蕉汪。

另外,根據(jù)源碼可知逞怨,調用execute后者疤,onPreExecute在調用線程中執(zhí)行,所以AsyncTask必須在UI線程中執(zhí)行叠赦。
因為AsyncTask中有些方法是根據(jù)調用線程來作為參數(shù)驹马,所以AysncTask應該在UI線程中創(chuàng)建。

至于一個AsyncTask只能執(zhí)行一次,我想可能是因為如果允許執(zhí)行多次的話窥翩,如果線程池為多個線程并行執(zhí)行业岁,那么我們在擴展該類時,必須考慮線程同步的問題寇蚊,這樣就有點麻煩了笔时。

public final AsyncTask<Params, Progress, Result> execute(Params... params) {
    return executeOnExecutor(sDefaultExecutor, params);
}
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
        Params... params) {
    ...
    onPreExecute();
    exec.execute(mFuture);
    return this;
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仗岸,隨后出現(xiàn)的幾起案子允耿,更是在濱河造成了極大的恐慌,老刑警劉巖扒怖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较锡,死亡現(xiàn)場離奇詭異,居然都是意外死亡盗痒,警方通過查閱死者的電腦和手機蚂蕴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俯邓,“玉大人骡楼,你說我怎么就攤上這事』蓿” “怎么了鸟整?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朦蕴。 經(jīng)常有香客問我篮条,道長,這世上最難降的妖魔是什么吩抓? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任涉茧,我火速辦了婚禮,結果婚禮上琴拧,老公的妹妹穿的比我還像新娘降瞳。我一直安慰自己,他們只是感情好蚓胸,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布挣饥。 她就那樣靜靜地躺著,像睡著了一般沛膳。 火紅的嫁衣襯著肌膚如雪扔枫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天锹安,我揣著相機與錄音短荐,去河邊找鬼倚舀。 笑死,一個胖子當著我的面吹牛忍宋,可吹牛的內(nèi)容都是我干的痕貌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼糠排,長吁一口氣:“原來是場噩夢啊……” “哼舵稠!你這毒婦竟也來了?” 一聲冷哼從身側響起入宦,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哺徊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乾闰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落追,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年涯肩,在試婚紗的時候發(fā)現(xiàn)自己被綠了轿钠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宽菜,死狀恐怖谣膳,靈堂內(nèi)的尸體忽然破棺而出竿报,到底是詐尸還是另有隱情铅乡,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布烈菌,位于F島的核電站阵幸,受9級特大地震影響,放射性物質發(fā)生泄漏芽世。R本人自食惡果不足惜挚赊,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望济瓢。 院中可真熱鬧荠割,春花似錦、人聲如沸旺矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箕宙。三九已至嚎朽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柬帕,已是汗流浹背哟忍。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工狡门, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锅很。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓其馏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爆安。 傳聞我的和親對象是個殘疾皇子尝偎,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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

  • Android開發(fā)者:你真的會用AsyncTask嗎? 導讀.1 在Android應用開發(fā)中鹏控,我們需要時刻注意保證...
    cxm11閱讀 2,709評論 0 29
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 3,206評論 1 15
  • AsyncTask 1.簡介 AsyncTask允許你執(zhí)行后臺耗時操作致扯,并將結果發(fā)布到UI線程。整個實現(xiàn)過程不需要...
    chewbee閱讀 1,374評論 0 1
  • 在Android中我們可以通過Thread+Handler實現(xiàn)多線程通信当辐,一種經(jīng)典的使用場景是:在新線程中進行耗時...
    呂侯爺閱讀 2,051評論 2 23
  • 最近一直琢磨著寫一個個人主頁抖僵,一番研究之后決定使用Jekyll在Github Page上搭建主頁。用了一天半的時間...
    _敏訥閱讀 383評論 0 1