上图是消息循环的过程,当线程进入Looper.loop()循环之后,会从MessageQueue中阻塞的读取Message,要是MessageQueue中没有消息,会一直阻塞在queue.next的地方,直到从MessageQueue中读取到Message,然后将该Message分发给Message的target,这个target是一个Handler的实例。
上图是Handler中消息分发的机制,当调用dispatchMessage进行消息分发的时候,优先判断Message的callback是否为空,Message的callback是一个Runnable,当我们通过Handler.post发送消息的时候,通常发送的就是这个Runnable(此处的callback),其次Handler会查看全局的mCallback是否为空,要是不为空,会通过mCallback来分发Message,最后是将Message分发给我们重写的handleMessage回掉中进行处理。
上图是Android中线程间消息通信的过程,线程B向线程A发送消息,线程A有两种状态:激活状态和休眠状态。
- 1. 当线程A中没有消息的时候,线程A就会处于休眠状态,此时线程A会监听eventfd这个变量;
- 2. 当线程B向线程A的消息队列中写入一条数据的时候,同时线程B也会向eventfd写入数据,从而唤醒线程A从消息队列中读取Message并开始处理。