android消息处理机制其实不难理解,这儿仅仅是一个读书笔记,所以有兴趣的同学可以看看
Android的消息处理机制:MessageQueue只是一个消息的存储单元,底部不是真正的队列,而是采用单链表的数据结构。Looper中还有一个特殊的概念,就是ThreadLocal,他的作用是可以在每个线程中存储数据。ThreadLocal是一个线程内部的数据存储类,通过他可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中获取到存储的数据。当某些数据需要一线程为作用域并且每个线程都有不同的数据副本的时候,就可以考虑ThreadLocal。在android 中,Looper、ActivityThread、以及AMS都用到了ThreadLocal。ThreadLocal之所以这么神奇,是因为不同的线程访问同一个ThreadLocal的get方法时,ThreadLocal内部会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引找出对应的value值。很显然,不同的线程中的数组不一样,这就是为什么通过ThreadLocal可以在不同的线程中维护一套数据的副本并且彼此互不干扰。ThreadLocal的内部实现:它是一个范型类,public class ThradLocal,有两个重要的方法,get和set。
MessageQueue主要包含两个操作,插入和读取,读取本身就伴随着删除操作,名字是一个队列,但底部确实用链表来实现的,因为单链表实现插入删除操作有着天然的优势。他的读取操作也就是next方法是一个无限循环的方法,如果队列没有消息就会阻塞,直到消息的到来。
Looper的工作原理:
主线程的消息循环:就是ActivityThread,入口方法为main,他内部定义了又消息类型,主要包括了组件的启动和停止等过程。ActivityThread是通过ApplicationThread和AMS进行进程间的通信。AMS以进程间的通信的方式完成ActivityThread的请求后会回调ApplicationThread的Binder方法,然后ApplicationThread会向ActivityThread中的Handler发送消息,Handler收到消息就会将ApplicationThread中的逻辑切换到ActivityThread中来执行。