🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
想不到,一个小小的MessageQueue竟然有如此多的内容。在后面分析Android输入系统时,我们会再次在Native层和MessageQueue碰面,这里仅是为后面的相会打下一定的基础。 现在,我们将站在一个比具体代码更高的层次来认识一下MessageQueue和它的伙伴们。 1. 消息处理的大家族合照 MessageQueue只是消息处理大家族的一员,该家族的成员合照如图2-5所示。 :-: ![](http://img.blog.csdn.net/20150803102851534?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图2-5 消息处理的家族合照 结合前述内容可从图2-5中得到: - Java层提供了Looper类和MessageQueue类,其中Looper类提供循环处理消息的机制,MessageQueue类提供一个消息队列,以及插入、删除和提取消息的函数接口。另外,Handler也是在Java层常用的与消息处理相关的类。 - MessageQueue内部通过mPtr变量保存一个Native层的NativeMessageQueue对象,mMessages保存来自Java层的Message消息。 - NativeMessageQueue保存一个native的Looper对象,该Looper从ALooper派生,提供pollOnce和addFd等函数。 - Java层有Message类和Handler类,而Native层对应也有Message类和MessageHandler抽象类。在编码时,一般使用的是MessageHandler的派生类WeakMessageHandler类。 * * * * * **注意** 在include/media/stagfright/foundation目录下也定义了一个ALooper类,它是供stagefright使用的类似Java消息循环的一套基础类。这种同名类的产生,估计是两个事先未做交流的Group的人写的。 * * * * * 2. MessageQueue处理流程总结 MessageQueue核心逻辑下移到Native层后,极大地拓展了消息处理的范围,总结一下有以下几点: - MessageQueue继续支持来自Java层的Message消息,也就是早期的Message加Handler的处理方式。 - MessageQueue在Native层的代表NativeMessageQueue支持来自Native层的Message,是通过Native的Message和MessageHandler来处理的。 - NativeMessageQueue还处理通过addFd添加的Request。在后面分析输入系统时,还会大量碰到这种方式。 - 从处理逻辑上看,先是Native的Message,然后是Native的Request,最后才是Java的Message。 对Java程序员来说,以前单纯的MessageQueue开始变得复杂。有同事经常与笔者讨论,cpu并不是很忙,为什么sendMessage的消息很久后才执行?是的,对于只了解MessageQueue Java层的工作人员,这个问题还是没办法回答。因为MessageQueue在Native层的兄弟NativeMessageQueue可能正在处理一个Native的Message,而Java的调用堆栈信息又不能打印Native层的活动,所以这个对Java程序员来说看上去很面善的MessageQueue,还是让笔者为某些只沉迷于Java语言的同仁们感到担心。