Handler对于安卓开发者来说并不陌生,相信不少同学都在网上看到过各种各样的有关于Handler机制的文章,所以这里也不再赘述,主要是梳理一下几个类的关系、消息处理流程以及理解线程切换的原理。
类的关系
我们都知道,Handler中需要关注的无非就是这四个类,Handler、Message、MessageQueue、Looper。
从成员变量上看它们的关系如下所示,
Handler:持有 Looper、MessageQueue
Looper:持有 MessageQueue
Message:持有 Handler
消息处理流程
整个消息发送处理的流程如下,
1.调用 Looper.prepare() 初始化所在线程的 Looper ,并调用 Looper.loop() 方法开启循环
2.调用 new Handler(Looper.myLooper()) 初始化 Handler
3. Handler通过将消息塞给MessageQueue
4. Looper 从 MessageQueue 中读取消息
5. Looper 处理消息,调用 msg.target.dispatchMessage(msg) 把消息转回给 Handler 去处理
6. Handler 处理消息
理解线程切换
从职责上看它们的关系如下所示,
Handler:发送消息
MessageQueue:存储消息
Looper:读取消息
这个模型是不是很常见,特别是在跨进程/线程通信里面,当不同进程/线程需要进行通信时,它们总是需要一个公共的双方都能获取到的空间,去做信息的交换,比如共享内存。
在 Handler 机制中,MessageQueue 其实就是扮演了公共空间的角色,它存储来自于任意线程的 Handler 发送过来的消息,而 Loopr 则永远在它所在的线程里面去读取到这个消息。