学习Handler 需要掌握ThreadLocal、Linux内核的IO复用 epoll
配合源码一起看更好
书籍:深入理解Android
一、ActivityThread main方法
Looper初始化
1.Looper.prepareMainLooper
2.Looper.loop方法
loop 方法非常重要 他主要2件事
- 从MessageQueue.next 读取消息对象
- 调用Message.target.dispatchMessage 就是handler的dispatchMessage
二、Handler如何存入消息的
1.Handler.sendMessage方法 enqueueMessage方法
这里 把 msg.target = handler,注意的是如何获取的主线唯一的MessageQueue 看Handler构造方法就可以了,mQueue = Looper.myLooper().mQueue(非主线程去调用Looper.myLooper会报错,ThreadLocal.get == null)后面会讲述非主线程怎么使用Handler
2.MessageQueue.enqueueMessage
这里最主要的两件事情就是
1.维护Message 中单链表 msg.when最小的是消息头
2.判断是否唤醒
三、MessageQueue.next 如何取消息
特别注意这个 nextPollOnce,next方法会阻塞在这里
四、MessageObtain 方法是没有对象池的
我们自己调用Message.obtain 中是没有对象池的 每次都会给你返回一个 new Message
可以打断点看一下 对象池的使用是Android Framework层自己用的