AsyncTask和Handler的優(yōu)缺點比較

AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現(xiàn)異步操作,并提供接口反饋當(dāng)前異步執(zhí)行的程度(可以通過接口實現(xiàn)UI進度更新),最后反饋執(zhí)行的結(jié)果給UI主線程.

使用的優(yōu)點:

簡單,快捷

過程可控??????

使用的缺點:

在使用多個異步操作和并需要進行Ui變更時,就變得復(fù)雜起來.

Handler異步實現(xiàn)的原理和適用的優(yōu)缺點

在Handler 異步實現(xiàn)時,涉及到 Handler, Looper, Message,Thread四個對象僚楞,實現(xiàn)異步的流程是主線程啟動Thread(子線程)運行并生成Message-Looper獲取Message并傳遞給HandlerHandler逐個獲取Looper中的Message骄蝇,并進行UI變更唁影。

使用的優(yōu)點:

結(jié)構(gòu)清晰,功能定義明確

對于多個后臺任務(wù)時翅楼,簡單娃属,清晰

使用的缺點:

?在單個后臺異步處理時切诀,顯得代碼過多,結(jié)構(gòu)過于復(fù)雜(相對性)


AsyncTask介紹

Android的AsyncTask比Handler更輕量級一些(只是代碼上輕量一些缨睡,而實際上要比handler更耗資源),適用于簡單的異步處理陈辱。

首先明確Android之所以有Handler和AsyncTask奖年,都是為了不阻塞主線程(UI線程),且UI的更新只能在主線程中完成沛贪,因此異步處理是不可避免的陋守。


Android為了降低這個開發(fā)難度,提供了AsyncTask利赋。AsyncTask就是一個封裝過的后臺任務(wù)類水评,顧名思義就是異步任務(wù)。

AsyncTask直接繼承于Object類媚送,位置為android.os.AsyncTask中燥。要使用AsyncTask工作我們要提供三個泛型參數(shù),并重載幾個方法(至少重載一個)塘偎。


AsyncTask定義了三種泛型類型 Params疗涉,Progress和Result。

Params 啟動任務(wù)執(zhí)行的輸入?yún)?shù)吟秩,比如HTTP請求的URL咱扣。

Progress 后臺任務(wù)執(zhí)行的百分比。

Result 后臺執(zhí)行任務(wù)最終返回的結(jié)果涵防,比如String闹伪。

使用過AsyncTask 的同學(xué)都知道一個異步加載數(shù)據(jù)最少要重寫以下這兩個方法:

doInBackground(Params…) 后臺執(zhí)行,比較耗時的操作都可以放在這里壮池。注意這里不能直接操作UI偏瓤。此方法在后臺線程執(zhí)行,完成任務(wù)的主要工作火窒,通常需要較長的時間硼补。在執(zhí)行過程中可以調(diào)用publicProgress(Progress…)來更新任務(wù)的進度驮肉。

onPostExecute(Result)? 相當(dāng)于Handler 處理UI的方式熏矿,在這里面可以使用在doInBackground 得到的結(jié)果處理操作UI。 此方法在主線程執(zhí)行离钝,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回

有必要的話你還得重寫以下這三個方法票编,但不是必須的:

onProgressUpdate(Progress…)?? 可以使用進度條增加用戶體驗度。 此方法在主線程執(zhí)行卵渴,用于顯示任務(wù)執(zhí)行的進度慧域。

onPreExecute()??????? 這里是最終用戶調(diào)用Excute時的接口,當(dāng)任務(wù)執(zhí)行之前開始調(diào)用此方法浪读,可以在這里顯示進度對話框昔榴。

onCancelled()???????????? 用戶調(diào)用取消時辛藻,要做的操作

使用AsyncTask類,以下是幾條必須遵守的準則:

Task的實例必須在UI thread中創(chuàng)建互订;

execute方法必須在UI thread中調(diào)用吱肌;

不要手動的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法仰禽;

該task只能被執(zhí)行一次氮墨,否則多次調(diào)用時將會出現(xiàn)異常;

Handler介紹

?一吐葵、??Handler主要接受子線程發(fā)送的數(shù)據(jù), 并用此數(shù)據(jù)配合主線程更新UI.

當(dāng)應(yīng)用程序啟動時规揪,Android首先會開啟一個主線程, 主線程為管理界面中的UI控件,進行事件分發(fā),更新UI只能在主線程中更新温峭,子線程中操作是危險的猛铅。這個時候,Handler就需要出來解決這個復(fù)雜的問題凤藏。由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數(shù)據(jù), 這個時候奕坟,Handler就承擔(dān)著接受子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(里面包含數(shù)據(jù)), 把這些消息放入主線程隊列中,配合主線程進行更新UI清笨。

二月杉、Handler的特點

Handler可以分發(fā)Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創(chuàng)建他的線程中,

它有兩個作用:?

(1)安排消息或Runnable 在某個主線程中某個地方執(zhí)行?

(2)安排一個動作在不同的線程中執(zhí)行

Handler中分發(fā)消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post類方法允許你排列一個Runnable對象到主線程隊列中,

sendMessage類方法, 允許你安排一個帶數(shù)據(jù)的Message對象到隊列中,等待更新.

綜上所述:數(shù)據(jù)簡單使用AsyncTask:實現(xiàn)代碼簡單抠艾,數(shù)據(jù)量多且復(fù)雜使用handler+thread :相比較AsyncTask來說能更好的利用系統(tǒng)資源且高效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苛萎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子检号,更是在濱河造成了極大的恐慌腌歉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齐苛,死亡現(xiàn)場離奇詭異翘盖,居然都是意外死亡,警方通過查閱死者的電腦和手機凹蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門馍驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玛痊,你說我怎么就攤上這事汰瘫。” “怎么了擂煞?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵混弥,是天一觀的道長。 經(jīng)常有香客問我对省,道長蝗拿,這世上最難降的妖魔是什么晾捏? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮哀托,結(jié)果婚禮上粟瞬,老公的妹妹穿的比我還像新娘。我一直安慰自己萤捆,他們只是感情好裙品,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俗或,像睡著了一般市怎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辛慰,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天区匠,我揣著相機與錄音,去河邊找鬼帅腌。 笑死驰弄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的速客。 我是一名探鬼主播戚篙,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溺职!你這毒婦竟也來了岔擂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浪耘,失蹤者是張志新(化名)和其女友劉穎乱灵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體七冲,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡痛倚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澜躺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝉稳。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苗踪,靈堂內(nèi)的尸體忽然破棺而出颠区,到底是詐尸還是另有隱情,我是刑警寧澤通铲,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站器贩,受9級特大地震影響颅夺,放射性物質(zhì)發(fā)生泄漏朋截。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一吧黄、第九天 我趴在偏房一處隱蔽的房頂上張望部服。 院中可真熱鬧,春花似錦拗慨、人聲如沸廓八。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剧蹂。三九已至,卻和暖如春烦却,著一層夾襖步出監(jiān)牢的瞬間宠叼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工其爵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冒冬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓摩渺,卻偏偏與公主長得像简烤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摇幻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359