Hander與HanderThread,Looper以及MessageQueue和Message之間的關(guān)系.
Hander與HanderThread,Looper以及MessageQueue和Message之間的關(guān)系.
以上這幾個(gè)東西的目的是設(shè)計(jì)來解決位于主線程中的某些操作比較耗時(shí)(比如httpclient請(qǐng)求),影響界面響應(yīng),而導(dǎo)
致主程序無法處理其他監(jiān)聽事件。致使程序卡死的問題。(界面提示,無響應(yīng)關(guān)閉)
1:Handler對(duì)象 中有兩個(gè)屬性,一個(gè)是來自于當(dāng)前線程(或者擁有Looper對(duì)象的線程)的threadlocal變量中的Looper
對(duì)象和該looper對(duì)象中的messagequeue屬性。
有這兩個(gè)屬性的目的主要是往當(dāng)前線程的looper對(duì)象的messagequeue隊(duì)列中加入message對(duì)象。
2:Message對(duì)象,也有兩個(gè)重要的屬性,一個(gè)是Hander對(duì)象,這個(gè)handler對(duì)象就是把該message加入隊(duì)列的那
個(gè)handler對(duì)象,另一個(gè)對(duì)象就是bundle對(duì)象,這個(gè)對(duì)象的目的就是用來存儲(chǔ)數(shù)據(jù),相當(dāng)于一個(gè)hashmap對(duì)象。
3:Looper對(duì)象,有一個(gè)重要的屬性就是MessageQueue對(duì)象,Looper的loop方法,會(huì)不斷的從該隊(duì)列中讀取message對(duì)
象,并調(diào)用messgae對(duì)象中的Hander屬性對(duì)象的dispatherMessage(msg)方法,該方法,就是會(huì)調(diào)
用handler的handleMessage方法,(也就是我們重寫的那個(gè)方法)。
4:MessageQueue對(duì)象,管理message的隊(duì)列對(duì)象,它有一個(gè)屬性就是Message對(duì)象,MessageQueue中始終只有一
個(gè)message對(duì)象,因?yàn)閙essage對(duì)象是一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)的對(duì)象,它的prv和next屬性記錄了他之前和之后的message對(duì)象,所
以,我們調(diào)用MessageQueue的next方法就能回的需要的message對(duì)象。
從hander與Looper以及MessageQueue和Message的關(guān)系中我們可以看出來,執(zhí)行流程如下:
1:有人創(chuàng)建hander對(duì)象,并取得對(duì)應(yīng)的Looper對(duì)象賦給該hander,通過Hander的sendmessage或post方法將handler
包裝到message對(duì)象中, 再將該message對(duì)象加入到消息隊(duì)列中。(消息隊(duì)列就是Looper對(duì)象中消息隊(duì)列屬性)
2:線程(管理Looper對(duì)象的線程)不斷的調(diào)用Looper對(duì)象中的loop方法,loop方法又從messageQueue隊(duì)列中獲
取Message對(duì)象,然后調(diào)用該對(duì)象里的hander屬性對(duì)象的dispatherMessage(msg)方法,從而,依次執(zhí)行我們加入
的handler任務(wù)。
這就是hander的處理流程。那么HandlerThread是做什么的,他是一個(gè)管理Looper對(duì)象的線程類。我們的Looper一般來自
于兩個(gè)地方,一個(gè)地方就是主線程的Looper對(duì)象,另一個(gè)就是我們另外開啟一個(gè)線程來創(chuàng)建和管理Looper對(duì)
象。android提供已經(jīng)給我們提供了一種這樣的一個(gè)類,那就是HandlerThread對(duì)象。
posted on 2012-07-19 16:59 sam.chuan.yang 閱讀(863) 評(píng)論(0) 編輯 收藏 所屬分類: android