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