資源描述:
《android消息處理機(jī)制之handler》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、消息傳遞機(jī)制之Handler使用總結(jié)一.Handler基礎(chǔ)知識(shí)Handler消息處理機(jī)制是一個(gè)功能強(qiáng)大的數(shù)據(jù)傳遞機(jī)制,主要功能是用來(lái)把子線(xiàn)程的數(shù)據(jù)傳遞給主線(xiàn)程,讓主線(xiàn)程進(jìn)行UI操作。android的消息處理有三個(gè)核心類(lèi):Looper,Handler和Message<>其實(shí)還有一個(gè)MessageQueue(消息隊(duì)列),但是MQ被圭寸裝到Looper里面了,我們不會(huì)直接與MessageQueue打交道,因此我沒(méi)將其作為核心類(lèi)。下面一一介紹:(一)線(xiàn)程的魔法師LooperLooper的字面意思是“循環(huán)者”,它被設(shè)計(jì)用來(lái)使一個(gè)普通線(xiàn)程變成L
2、ooper線(xiàn)程。所謂Looper線(xiàn)程就是循環(huán)工作的線(xiàn)程。在程序開(kāi)發(fā)中(尤其是GUI開(kāi)發(fā)中),我們經(jīng)常會(huì)需要一個(gè)線(xiàn)程不斷循環(huán),一旦有新任務(wù)則執(zhí)行,執(zhí)行完繼續(xù)等待下一個(gè)任務(wù),這就是Looper線(xiàn)程。使用Looper類(lèi)創(chuàng)建Looper線(xiàn)程很簡(jiǎn)單:publicclassLooperThreadextendsThread{@0verride3.publicvoidrun(){//將當(dāng)前線(xiàn)程初始化為L(zhǎng)ooper線(xiàn)程Looper,prepare();//...其他處理,如實(shí)例化handler//開(kāi)始循環(huán)處理消息隊(duì)列Looper,loop();}}
3、通過(guò)上面兩行核心代碼,你的線(xiàn)程就升級(jí)為L(zhǎng)ooper線(xiàn)程了!在主線(xiàn)程中,上面這兩個(gè)Looper的方法,系統(tǒng)已經(jīng)幫我們做好了,直接實(shí)例化Handler對(duì)象就可以使用了,但是在子線(xiàn)程中,需要我們自己寫(xiě)這兩個(gè)方法來(lái)升級(jí)為L(zhǎng)ooper線(xiàn)程。注意:Looper.loop()之后的方法不會(huì)再執(zhí)行到1.Looper,prepare()Looper預(yù)處理操作,效果如下圖所示:LooperThreadLooper線(xiàn)程Looper消息隊(duì)列通過(guò)上圖可以看到,現(xiàn)在你的線(xiàn)程中有一個(gè)Looper對(duì)象,它的內(nèi)部維護(hù)了一個(gè)消息隊(duì)列MQo注意,一個(gè)Thread只能有一
4、個(gè)Looper對(duì)象。Looper,prepare()方法的簡(jiǎn)單代碼:publicstaticfinalvoidprepare(){if(sThreadLocal.get()!二null){//試圖在有Looper的線(xiàn)程中再次創(chuàng)建Looper將拋出異常thrownewRuntimeException(〃0nlyoneLoopermaybecreatedperthread'");sThreadLocal.set(newLooper()):這個(gè)方法確保一個(gè)線(xiàn)程只用一個(gè)Looper對(duì)象。1.Looper.loop()保持循環(huán)接收信息的方法任
5、務(wù)執(zhí)行的示意圖:Looper.loopf)LooperThreadMessageLooperMessageMessage隊(duì)Messagesage調(diào)用loop方法后,Looper線(xiàn)程就開(kāi)始真正丁作了,它不斷從自己的MQ中取出隊(duì)頭的消息(也叫任務(wù))執(zhí)行。3?除了prepare()和loop()方法,Looper類(lèi)還提供了一些有用的方法,(1)Looper.myLooper()得到當(dāng)前線(xiàn)程looper對(duì)象:publicstaticfinalLoopermyLooper()(2)getThread()得到looper對(duì)象所屬線(xiàn)程:publi
6、cThreadgetThread()(3)quit()方法結(jié)束looper循環(huán):publicvoidquit()4.Looper總結(jié)每個(gè)線(xiàn)程有且最多只能有一個(gè)Looper對(duì)象,它是一個(gè)ThreadLocalLooper內(nèi)部有一個(gè)消息隊(duì)列,loop()方法調(diào)用后線(xiàn)程開(kāi)始不斷從隊(duì)列中取出消息執(zhí)行Looper使一個(gè)線(xiàn)程變成Looper線(xiàn)程。(二)異步處理大師Handler什么是Handler?Handler扮演了往MQ上添加消息和處理消息的角色(只處理由自己發(fā)出的消息),即通知MQ它要執(zhí)行一個(gè)任務(wù)(sendMessage),并在loop到
7、自己的時(shí)候執(zhí)行該任務(wù)(handleMessage),整個(gè)過(guò)程是異步的。handler創(chuàng)建時(shí)會(huì)關(guān)聯(lián)一個(gè)looper,默認(rèn)的構(gòu)造方法將關(guān)聯(lián)當(dāng)前線(xiàn)程的looper,不過(guò)這也是可以set的。下面是Handler消息處理的示意圖:LooperThreadLooperHandler1Handler2消息隊(duì)列rHandler1LLooperr—Handler21hLooper1J可以看到,一個(gè)線(xiàn)程可以有多個(gè)Handler,但是只能有一個(gè)Looper!有了Handler對(duì)象之后,我們就可以使用下面一些方法來(lái)發(fā)送消息1.post(Runnable)2
8、.postAtTime(Runnable,long)3.postDelayed(Runnable,long)4.sendEmptyMessage(int)5.sendMessage(Message)6.sendMessageAtTim