通俗地講,Android中的多線程通信就可以認爲是Handler機制。
在Handler的整個機制中,我們首先要知道四個部分:
- Message
- MessageQueue;
- Handler;
- Looper;
Message中的三個重要屬性:
- target —— 綁定Handler的;
- callback —— Handler 的post()相關方法和Message進行關聯的;
- when —— 消息延時及MessageQueue排序用的;
Looper 通過 ThreadLocal ,保證 Thread 和 MessageQueue 進行 綁定。
Handler 就是一個發送消息(send,post)和處理消息(handleCallback,handleMessage)的。
MessageQueue 纔是真正處理阻塞和 延時功能 的地方。
MessageQueue在next()方法中進行消息出隊列和阻塞處理;
如果nextPollTimeoutMillis=-1,一直阻塞不會超時。
如果nextPollTimeoutMillis=0,不會阻塞,立即返回。
如果nextPollTimeoutMillis>0,最長阻塞nextPollTimeoutMillis毫秒(超時),如果期間有程序喚醒會立即返回。
而且MessageQueue在enqueueMessage()時按照when進行排序的。
這裏還有很重要的一點:postDelayed() 和 sendMessageDelayed()是由一些區別的,postDelayed()的延遲是不夠精準的,畢竟線程是基於時間片的,中間過程不能預測的。