Android源码解读——Handler
事实上handler传递消息(Message)的过程就是消息(Message)运动的过程
(1)过程
handler --> sendMessage --> messageQueue.enqueueMessage() --> Looper.loop() --> messageQueue.next() --> handler.dispatchMessage() --> handler.handleMessage()
翻译成中文:handler通过sendMessage,将消息(Message)放入消息队列(messageQueue),然后通过loop()轮询消息,最后将消息通过handleMessage传出去
(2)如果进行线程之间的通讯?
- 由于new Message()或obtain()消息时,都会在内存里开辟一片空间来存放消息,而线程之间并没有内存区分,内存里面的东西任何线程都可以使用,因此主线程可以去从内存里面获取子线程创建的消息(Message);
- sendMessage动作是在子线程执行,而handleMessage是在主线程执行。
(3)messageQueue——由单链表实现的优先级队列,用来存放消息(Message)
如何判定是单链表?
Message类里面有next变量,而next变量本身就是一个Message,因此可得:Message-->next(本身就是Message)-->next(本身就是Message)-->……
如何算优先级?
根据时间排序,插入排序算法。无论是sendMessage还是postMessage,最终都会执行sendMessageAtTime()方法,该方法是给Message添加一个执行时间,那么当有一个消息进入的时候,在消息上添加这个时间属性之后,在enqueueMessage方法里会与已存在队列里面的消息去对比他们的执行时间,当执行时间长于某个消息而短于后一个消息时,该消息则会插入在此处,并与之前的消息列队形成一个新的链表。
为什么是队列?
取消息先取时间短的,保证先执行的先被用到,也就是先用先出原则,因此需要用一个队列。
(4)使用Message时如何创建他?执行完毕如何清除?
实际上,Android对Message用到了一个设计模式就是享元设计模式。当某条消息执行完之后,会对这条消息的信息进行置空处理,而不是直接从内存里面清除,这样当有新消息产生的时候,可以复用之前被置空的消息的内存区域,防止产生内存碎片,因此避免了内存抖动,不至于造成OOM。