handler機制要做的事情:
1.把一堆從四面八方傳來的message加到一個隊列中,這個隊列就是MessageQueue。
2.將MessageQueue中的隊頭Message取出,並使用這個message自帶的handler來handleMessage。
稍微有些特別的是,handler將這兩件事分成兩個線程來處理,這樣就保證了服務器能在處理msg1的同時將msg2入隊。
所以Message.java就是鏈式隊列MessageQueue中的Node,特別的是除了要存基本的信息之外,還要保存一個Handler,這樣處理消息的線程就知道應該如何處理這條消息。
上面說了Message.java 和MessageQueue.java,接下來說Handler.java和Looper.java。
Handler.java:
一個處理msg的工具,它有兩個方法:sendMessage()和handleMessage(),上面說的那兩件事就是分別用這兩個方法來完成的。
要注意的是,Handler中存了一個MessageQueue,這個mq與Looper中的mq相關聯,換句話說,這兩個mq共用一個內存單元。怎樣實現這件事呢:handler的構造函數要傳入一個Looper,handler在初始化時將handler的mq指向looper的mq。
Looper.java:
這個東西有點抽象,做一個比喻,Message是雞腿、MessageQueue是冰箱、Handler就是兩個動作:把雞腿放冰箱里;把雞腿拿出來並且吃掉。這樣來看有了上面三個程序,好像我已經可以把雞腿放冰箱里並且拿出來吃掉了,那為什么要有looper這個東西?
looper在這里做的事情應該說很靈魂了,有兩點:
1.它保存了最重要的東西:mq,也就是looper才知道冰箱在哪里,甚至說這個冰箱是looper創建的。
2.loop()是一個死循環,這個循環里不斷執行兩個動作:把雞腿拿出來並且吃掉。也就是上面說的handler機制要做的第二件事:消息出隊並處理消息。
所以說,如果沒有looper我甚至不知道有雞腿的冰箱在哪,我雖然會拿雞腿、吃雞腿這兩個動作,但我並不知道要這樣做,沒有looper我就是一個吃不到雞腿的小可憐!
消息入隊的線程:不停的進行消息入隊這個動作,每個msg自帶一個target:handler,所以它被放入這個handler的mq中,而handler在初始化時就將自己的mq指向了looper中的mq。
消息出隊並處理消息的線程:這個線程調用了loop(),不停的從mq中取出隊頭元素,這個mq正是這個looper中保存的mq,也就是消息入隊線程中handler指向的那個mq。
這樣兩個線程就對同一個mq同時執行不同的動作。