这几天和大佬吹牛逼被虐了又回来看了handler
首先看handler机制包括以下3重点 Handler Looper Message MessageQueue
1.handler.java
这个东西的用处包括两方面
dispatchMessage 分发message
handleMessage 处理message
sendMessageAtTime 重要方法 所有sendMessage的方法到最后都是调用他
2.Looper.java
这个东西就是用来循环处理消息的
最终要的 部分
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
这个就是个map key是threadId value是每个线程自己的 Looper 再加上调是个static final类型 就是唯一的意思
还有就是把mainLooper这个东西额外的拿出来维护了(主线程的Looper)
2.1创建:
Looper的使用一般都是先looper.prepare();
然后先去sThreadLocal 这个里面找是否当前线程有looper实例了 有了就报错
没有就创建 然后会同步创建MessageQueue 再添加到sThreadLocal 创建结束
第一次创建当然在MainThread中啦
2.2 使用
Looper的使用Looper.loop()
这个方法就是用来循环处理消息
里面有个MessageQueue 从里面拿消息拿到消息之后效用message的Handler来处理这个message就是handlerMessage方法
2.3结束
Looper.quit()
用来结束的 实际上就是传递给MessageQUeue
3.Message
包含两个链表一个next 用来表示消息队列 一个sPool表示回收的队列
4.MessageQueue
这个东西的用处就是用来排序消息的 回顾Handler是不是有方法
sendMessageAtTime 这个东西有一个时间参数就是在这个使用的
4.1 enqueueMessage() 把message塞给handler最终会塞给这个方法 用来排序message 按时间排序 接近当前时间就排第一个 4.2 Message next()
这个方法用来取message 每次调用这个方法会取第一个message 判断时间是否到了 没到就阻塞相应时间
4.3 quit()
回收所有的message
看完之后我一脸懵逼 为什么这个MessageQueue阻塞了 不会anr呢 然后就得去看native中的方法了epoll