- 一、Why Handler?
Android中的UI控件是非線程安全的款票,因此更新UI的操作只能放到UI線程中處理跨琳,也就是主線程。Google由此引入了Handler機(jī)制來解決這個(gè)問題生音。 - 二、Handler是什么窒升?
1.Handler是Android中引入的處理消息循環(huán)的一種機(jī)制缀遍。每個(gè)Handler都關(guān)聯(lián)了一個(gè)線程,每個(gè)線程內(nèi)部都維護(hù)了一個(gè)消息隊(duì)列MessageQueue,這樣Handler實(shí)際上也就關(guān)聯(lián)了一個(gè)消息隊(duì)列饱须。
2.可以通過Handler將Message和Runnable對象發(fā)送到該Handler所關(guān)聯(lián)線程的MessageQueue(消息隊(duì)列)中域醇,然后該消息隊(duì)列不斷地循環(huán)取出一個(gè)Message進(jìn)行處理。
3.當(dāng)創(chuàng)建一個(gè)Handler的時(shí)候蓉媳,該Handler就綁定了當(dāng)前創(chuàng)建Handler的線程譬挚。 - 三、怎么使用督怜?
1.post()殴瘦、postDelayed()
調(diào)用Handler的post()方法可以將一個(gè)Runnable對象添加到消息隊(duì)列。
postDelayed()方法則是可以指定延時(shí)添加的時(shí)間号杠。 -
代碼示例:
聲明一個(gè)Handler對象
Paste_Image.png
開啟一個(gè)新的線程用來模擬延時(shí)操作蚪腋,當(dāng)業(yè)務(wù)執(zhí)行完畢后丰歌,調(diào)用post()方法,因?yàn)镠andler綁定的線程就是UI主線程屉凯,所以當(dāng)Handler在合適的時(shí)機(jī)來處理這條Runnable對象的消息時(shí)立帖,就實(shí)現(xiàn)了在UI線程更新UI。
Paste_Image.png
-
2.使用sendMessage()方法
通過在延時(shí)操作的子線程中調(diào)用sendMessage()向消息隊(duì)列發(fā)送msg.此外Message對象還可以攜帶一些數(shù)據(jù) 簡單int悠砚,Object晓勇,Bundle類型
- 代碼示例:
首先聲明一個(gè)Handler的內(nèi)部類,重寫handleMessage()方法
- 代碼示例:
Paste_Image.png
然后實(shí)例化一個(gè)子線程:在耗時(shí)業(yè)務(wù)執(zhí)行完畢后灌旧,想Handler發(fā)送一個(gè)Message
Paste_Image.png
-
- 使用sendMessage()的步驟:
- 重寫Handler的handleMessage方法绑咱,根據(jù)Message的what值進(jìn)行不同的處理操作
- 創(chuàng)建Message對象
雖然Message的構(gòu)造函數(shù)式public的,我們還可以通過Message.obtain()或Handler.obtainMessage()來獲得一個(gè)Message對象(Handler.obtainMessage()內(nèi)部其實(shí)調(diào)用了Message.obtain())。 - 設(shè)置Message的what值
Message.what是我們自定義的一個(gè)Message的識別碼枢泰,以便于在Handler的handleMessage方法中根據(jù)what識別出不同的Message描融,以便我們做出不同的處理操作。 - 設(shè)置Message的所攜帶的數(shù)據(jù)衡蚂,簡單數(shù)據(jù)可以通過兩個(gè)int類型的field arg1和arg2來賦值窿克,并可以在handleMessage中讀取。
- 如果Message需要攜帶復(fù)雜的數(shù)據(jù)毛甲,那么可以設(shè)置Message的obj字段年叮,obj是Object類型,可以賦予任意類型的數(shù)據(jù)玻募≈凰穑或者可以通過調(diào)用Message的setData方法賦值Bundle類型的數(shù)據(jù),可以通過getData方法獲取該Bundle數(shù)據(jù)补箍。
- 我們通過Handler.sendMessage(Message)方法將Message傳入Handler中讓其在handleMessage中對其進(jìn)行處理改执。
需要說明的是啸蜜,如果在handleMessage中 不需要判斷Message類型坑雅,那么就無須設(shè)置Message的what值;而且讓Message攜帶數(shù)據(jù)也不是必須的衬横,只有在需要的時(shí)候才需要讓其攜帶數(shù)據(jù)裹粤;如果確實(shí)需要讓Message攜帶數(shù)據(jù),應(yīng)該盡量使用arg1或arg2或兩者蜂林,能用arg1和arg2解決的話就不要用obj遥诉,因?yàn)橛胊rg1和arg2更高效。
.0.