資源描述:
《安卓消息制詳解.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Android消息處理機(jī)制2011-10-2813:362951人閱讀評論(7)收藏舉報(bào)目錄(?)[+]1.Android的消息機(jī)制(一)2.Android消息處理機(jī)制(二)3.用Android線程間通信的Message機(jī)制4.Android中Handler的使用方法——在子線程中更新界面5.線程的魔法師Looper6.異步處理大師Handler7.封裝任務(wù)MessageGoogle參考了Windows的消息處理機(jī)制,在Android系統(tǒng)中實(shí)現(xiàn)了一套類似的消息處理機(jī)制。學(xué)習(xí)Android的消息處
2、理機(jī)制,有幾個(gè)概念(類)必須了解:1.??????Message消息,理解為線程間通訊的數(shù)據(jù)單元。例如后臺(tái)線程在處理數(shù)據(jù)完畢后需要更新UI,則可發(fā)送一條包含更新信息的Message給UI線程。2.??????MessageQueue消息隊(duì)列,用來存放通過Handler發(fā)布的消息,按照先進(jìn)先出執(zhí)行。3.??????HandlerHandler是Message的主要處理者,負(fù)責(zé)將Message添加到消息隊(duì)列以及對消息隊(duì)列中的Message進(jìn)行處理。4.??????Looper循環(huán)器,扮演Messag
3、eQueue和Handler之間橋梁的角色,循環(huán)取出MessageQueue里面的Message,并交付給相應(yīng)的Handler進(jìn)行處理。5.???線程UIthread通常就是mainthread,而Android啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)MessageQueue。每一個(gè)線程里可含有一個(gè)Looper對象以及一個(gè)MessageQueue數(shù)據(jù)結(jié)構(gòu)。在你的應(yīng)用程序里,可以定義Handler的子類別來接收Looper所送出的消息。運(yùn)行機(jī)理:??????每個(gè)線程都可以并僅可以擁有一個(gè)Looper實(shí)例,消息隊(duì)列
4、MessageQueue在Looper的構(gòu)造函數(shù)中被創(chuàng)建并且作為成員變量被保存,也就是說MessageQueue相對于線程也是唯一的。Android應(yīng)用在啟動(dòng)的時(shí)候會(huì)默認(rèn)會(huì)為主線程創(chuàng)建一個(gè)Looper實(shí)例,并借助相關(guān)的Handler和Looper里面的MessageQueue完成對Activities、Services、BroadcaseReceivers等的管理。而在子線程中,Looper需要通過顯式調(diào)用Looper.Prepare()方法進(jìn)行創(chuàng)建。Prepare方法通過ThreadLocal
5、來保證Looper在線程內(nèi)的唯一性,如果Looper在線程內(nèi)已經(jīng)被創(chuàng)建并且嘗試再度創(chuàng)建"OnlyoneLoopermaybecreatedperthread"異常將被拋出。???????Handler在創(chuàng)建的時(shí)候可以指定Looper,這樣通過Handler的sendMessage()方法發(fā)送出去的消息就會(huì)添加到指定Looper里面的MessageQueue里面去。在不指定Looper的情況下,Handler綁定的是創(chuàng)建它的線程的Looper。如果這個(gè)線程的Looper不存在,程序?qū)伋?Can'
6、tcreatehandlerinsidethreadthathasnotcalledLooper.prepare()"。???????整個(gè)消息處理的大概流程是:1.包裝Message對象(指定Handler、回調(diào)函數(shù)和攜帶數(shù)據(jù)等);2.通過Handler的sendMessage()等類似方法將Message發(fā)送出去;3.在Handler的處理方法里面將Message添加到Handler綁定的Looper的MessageQueue;4.Looper的loop()方法通過循環(huán)不斷從MessageQu
7、eue里面提取Message進(jìn)行處理,并移除處理完畢的Message;5.通過調(diào)用Message綁定的Handler對象的dispatchMessage()方法完成對消息的處理。???????在dispatchMessage()方法里,如何處理Message則由用戶指定,三個(gè)判斷,優(yōu)先級從高到低:1.Message里面的Callback,一個(gè)實(shí)現(xiàn)了Runnable接口的對象,其中run函數(shù)做處理工作;2.Handler里面mCallback指向的一個(gè)實(shí)現(xiàn)了Callback接口的對象,由其hand
8、leMessage進(jìn)行處理;3.處理消息Handler對象對應(yīng)的類繼承并實(shí)現(xiàn)了其中handleMessage函數(shù),通過這個(gè)實(shí)現(xiàn)的handleMessage函數(shù)處理消息。???Android的消息機(jī)制(一)android有一種叫消息隊(duì)列的說法,這里我們可以這樣理解:假如一個(gè)隧道就是一個(gè)消息隊(duì)列,那么里面的每一部汽車就是一個(gè)一個(gè)消息,這里我們先忽略掉超車等種種因素,只那么先進(jìn)隧道的車將會(huì)先出,這個(gè)機(jī)制跟我們android的消息機(jī)制是一樣的。一、???角色描述1.Looper:(相當(dāng)于隧道)一個(gè)線程可