java——極簡handler機制


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同時執行不同的動作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM