Handler代表了Android系統(tǒng)中的消息機制芯义,Android系統(tǒng)中所有的事件都是通過Handler進行傳遞的储玫。
要理解Handler就不得不知道這幾個類 Looper墨坚、MessageQueue显蝌、ThreadLocal盖奈、Thread吏廉、ActivityThrad日戈、Message
類介紹
MessageQueue
單鏈數(shù)據(jù)結(jié)構(gòu)殷蛇,用來儲存管理系統(tǒng)中的消息
Message
重點是Message的when屬性康吵,他代表了消息執(zhí)行的時間劈榨,MessageQueue通過判斷當前時間是否大于Message的when時間來判斷是否將Message發(fā)送非Looper執(zhí)行
我們通過mHandler.sendMessageDelayed(Message , 1000);發(fā)送一個Message的時候?qū)嶋H上就設(shè)置這個消息的執(zhí)行時間是當前時間的1000毫秒之后等同于mHandler.sendMessageAtTime(Message, SystemClock.uptimeMillis() + 1000);
ThreadLocal
ThreadLocal解決了多線程程序的并發(fā)問題
它為每一個線程提供了一個獨立Looper的變量副本晦嵌,使得每一個不同線程中的Looper相對獨立互不影響
Looper
消息輪詢器同辣,它是一個死循環(huán)
每一個Looper對象都里面包含了一個MessageQueue
可以理解成使用死循環(huán)遍歷MessageQueue中的Message,把適合的消息拿出來執(zhí)行
Looper通過ThreadLocal與線程建立聯(lián)系惭载,在每一個線程中它都是一個單例旱函,所以可以理解Looper是一個線程安全的單例
分析
Looper創(chuàng)建并與Thread關(guān)聯(lián)
在ActivityThread的mian函數(shù)中
首先調(diào)用了Looper.prepareMainLooper(); 為主線程關(guān)聯(lián)了一個Looper
然后調(diào)用Looper.loop();開始輪詢;
剛才說了Looper是一個死循環(huán)描滔,為什么會是死循環(huán)呢?因為在學Java的時候就知道棒妨,當mian函數(shù)執(zhí)行完所有語句的時候就代表了程序結(jié)束,所有Looper在這里做死循環(huán)程序就不會退出伴挚。
我們可以推斷如果讓Looper退出死循環(huán)的話靶衍,我們的程序就退出了
myLooper() 是拿到當前線程對應(yīng)的Looper單例
sThreadLocal是ThreadLocal的實例通過set方法將Looper與Thread關(guān)聯(lián),然后在任何地方通過sThreadLocal.get()可以拿到Thread中的Looper實例
Handler的創(chuàng)建
Handler在創(chuàng)建的時候會通過Looper.myLooper();方法拿到Thread中的Looper對象茎芋。如果線程中沒有Thread對象Handler將會拋出異常
所以在子線程中使用Handler我們必須自己調(diào)用Looper.prepare();為這個子線程綁定Looper颅眶。然后調(diào)用Looper.loop();開始這個消息輪詢器
Handler于Looper的關(guān)系
我們在使用mHandler.sendMessage()發(fā)送一個Message的時候,Handler會將Message和Message執(zhí)行的時機(Message.when)添加到Looper中的MessageQueue中()田弥。這樣Looper在輪詢的時候就會在合適的時機拿到這個Message并且執(zhí)行涛酗。
Looper在拿到需要執(zhí)行的Message的時候會調(diào)用Handler.dispatchMessage()方法執(zhí)行Message。通過這個函數(shù)我們可以看出如果Message里面綁定了callback他會先直接執(zhí)行這個callback而不會執(zhí)行mCallback.handleMessage方法偷厦;這個callback實際上就是一個Runnable對象商叹;
如果Handler中設(shè)置了mCallback他會攔截Handler的handleMessage方法;這相當于給Handler增加了一個事件攔截的機制只泼。這個mCallback只能在通過Handler的構(gòu)造函數(shù)傳入
總結(jié)
通過分析Android的消息機制剖笙,我們可以知道我們傳入Handler中的Message統(tǒng)統(tǒng)被放到了Looper的MessageQueue中。MessageQueue會在何時的時候發(fā)送這個Message給Looper请唱,然后Looper將這個Message發(fā)送給Handler執(zhí)行弥咪。