android消息處理機(jī)制之handler

android消息處理機(jī)制之handler

ID:30767000

大小:227.72 KB

頁(yè)數(shù):19頁(yè)

時(shí)間:2019-01-03

android消息處理機(jī)制之handler_第1頁(yè)
android消息處理機(jī)制之handler_第2頁(yè)
android消息處理機(jī)制之handler_第3頁(yè)
android消息處理機(jī)制之handler_第4頁(yè)
android消息處理機(jī)制之handler_第5頁(yè)
資源描述:

《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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。