从handler.sendMessage()作为入口来分析:
1、Handler的sendMessage -> sendMessageDelay -> sendMessageAtTime;
2、可以看到最后调用sendMessageAtTime的方法,它的作用就是把Message.target = this 让Message先持有Handler对象,然后传给MessageQueue.enqueueMessage
3、enqueueMessage方法通过比较把Message加入到mMessage链表里面,这时候Message.when持有执行的时间,Message.next持有下一个消息
4、通过MessageQueue的注解可以看到Looper调用了它
5、Looper通过PRepare方法把自身传递个ThreadLocal对象,这个对象给维护Looper和线程的对应管线。(当前app的线程和looper映射关系都由ThreadLocal维护)
6、Looper调用loop方法,看到一个Looper持有一个MessageQueue对象,然后取出mMssage执行:
7、Message.target持有的handler对象再调用dispatchMessage传给handleMessage或者handleCallback回调接口实现功能
源码中Handler,MessageQueue,Looper,ThreadLocal类的注解,非常说明其作用;
新闻热点
疑难解答