Android消息机制设计

模型

  • Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息
  • MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next)
  • Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage)
  • Looper:不断循环执行(Looper.loop),按分发机制将消息分发给目标处理者

架构图

  • Looper有一个MessageQueue消息队列
  • MessageQueue有一组待处理的Message
  • MessageQueue中有一个成员变量 mPtr,关联C++层中的NativeMessageQuene
  • Message中有一个用于处理消息的Handler
  • Handler中有Looper和MessageQueue

MessageQueue对应的Cpp函数在 android_os_MessageQueue.cpp 中

线程消息队列创建流程

管道

  1. 在一个线程没有新的消息需要处理的时候,它就会睡眠在这个管道的读端文件描述符上,直到有新消息为止
  2. 当其他线程往这个线程的消息队列发送了一个消息后,其他线程就会通过这个管道的写端文件描述符往这个管道写入一个数据,从而将这个线程唤醒,然后这个线程就可以对消息队列中的消息进行处理

线程消息循环过程

  1. Looper类的loop()函数不断循环,检查消息队列是否有新消息,如果有消息,Message msg = queue.next() 不为空,否则在MessageQueue的next函数中处于睡眠等待状态
  2. 没有消息时,Looper类的成员函数pollInner中进入睡眠等待状态

线程消息发送过程

Handler是线程共享的

线程消息处理过程

处理完c++层的逻辑(唤醒)之后,沿着之前的调用路径返回到JAVA层的Looper类的loop中, 执行 queue.next() 之后的逻辑

线程空闲消息

IdleHandler:

1
2
3
4
5
6
/**
* 当线程处于等待状态时的回调
*/
public static interface IdleHandler {
boolean queueIdle();
}
  1. MessageQueue的成员变量 IdleHandler[] mPendingIdleHandlers 指向IdleHandler列表,用来保存一个线程的空闲消息处理器
  2. MessageQueue中包含有 addIdleHandlerremoveIdleHandler 两个函数用来注册和注销空闲消息处理器,传入的参数为 IdleHandler

可以让你更大化地利用线程资源,把一些不重要的事放在线程的空闲时间执行

参考博客 老罗 gityuan