android消息机制涉及角色:Message, MessageQueue, Handler,Looper,ThreadLocal
本文力求通俗的说明android消息机制,在基础的模型上一步步实现上述各个角色。
首先假设在java程序中实现类似功能:
1. 基础模型

上图实现了一个最简单的流程,就是MessageQueue里存放了需要处理的Message,main函数进入while循环,处理Mesage。
2. 添加Handler,插入消息到MessageQueue
Handler 可以往MessageQueue插入消息,MessageQueue中是以链表形式存放Message
android的Message在MessageQueue是按处理时间排列,本示例简单起见直接插在队尾


3. 添加Handler,处理Message
上述的Message处理比较麻烦,需要每一个Message都实现handle()函数



这样就把Message处理移到了Handler,只要重写其handleMessage方法,不用为每个Message重写handle().
4.添加Looper,屏蔽MessageQueue



5.添加ThreadLocal,使当前线程绑定且唯一的Looper,对应的也是唯一的MessageQueue



以上就是android消息模型的简单实现。这里为了易于理解省略了当前线程没有消息时的处理,推荐看下android2.1的源码,其使用了wait/notify实现了等待唤醒,当前版本是使用linux的epoll实现的唤醒。
android源码网址:http://androidxref.com/
网友评论