1.Handler
消息发送者和处理者
1.变量 Looper MessageQueue
2.发送消息:sendMessage(Message ,time) ,sendMessageAtTime(Message,long) 等方法 最终调用 MessageQueue的 enqueueMessage() 方法
3.处理消息 :dispatchMessage(Message msg) 如果 Message 中已经设置 Callback 则调用 handleCallback(msg) 如果Handler 设置了Callback 则调用了 callback.handleMessage()
2.Looper(消息轮询器)
1.初始化Looper Looper.prepare() , prepare()时会创建一个MessageQueue 同时 ThreadLocal 会使用一个键值对 将一个looper 绑定到与之相关联的线程中 ThreadLocal.set(new Looper(true)), 在ThreadLocal 可保存16对这样的键值对 ,当要使用looper时ThreadLocal.get()方法获取looper
2.Loope的r轮询 Looper.loop() 此时 可以通过当前的Looper对象获取MessageQueue 然后用for的死循环 调用messageQueue的 next方法 不断的取出Message 在通过message.taget.dispatchMessage(message) 处理消息
3.MessageQueue (消息队列)
1.enqueueMessage(message,time) MessageQueue 是一个按时间排序单链表的数据结构来存储消息列表存放Message 当插入消息时不断访问 Message 的下一个指针 当该指针的Message执行时间小于time时 则插入该Message;
2.next() for死循环从MessageQueue中获取消息,判断当前时间是否等于Message中的执行时间 如果小于Message中的执行时间 则 调用本地方法刷新等待时间
4.ThreadLocal
1.为了每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性
2.使用ThreadLocal 可以 使当前线程对象与 Looper绑定,ThreadLocal 内部提供了一个ThreadLocalMap 内部类 ThreadLocalMap 提供了一个继承自弱引用的内部类的数组形式保存当前线程对象所对应的looper。
3.ThreadLocalMap 的Entry数组长度初始值为16,当执行resize方法时会对数组进行两倍扩容
4.ThreadLocal的值在table数组中的存储位置总是为ThreadLocal的reference字段所标识的对象的下一个位置,比如ThreadLocal的reference对象在table数组的索引为index,那么ThreadLocal的值在table数组中的索引就是index+1
总结:
Handler消息的发送者和处理者 线程中通过Looper.prepare() 获取Looper对象,通过该对象 就可以获取与之绑定的MessageQueue对象。当handler 不断地sendMessage时 当前的messageQueue对象就会执行enqueueMessage()方法将Message存入MessageQueue中,当Looper执行loop()方法时for()死循环不断从MessageQueue中取出消息,然后通过Message中的绑定的handler对象执行dispatchMessage方法 处理消息;