本来想简单记录一下 Handler 的,但是发现其主要作用就是在 Android 上的消息传递,那就大概记录一下 Android 上的消息机制吧。
Handler 是 Android 消息机制的上层接口,用来将一个任务切换到 Handler 所在的线程中执行。
Android 的消息机制主要是指 Handler 的运行机制,Handler 的运行需要底层的 MessageQueue 和 Looper 的支撑。MessageQueue 内部存储了一组采用单链表的数据结构来存储的消息队列,以消息队列的形式对外提供插入和删除的工作。Looper 以无限循环的形式去查看 MessageQueue 中是否又新消息并处理,没有的话则一直等待。
Looper 中的 ThreadLocal 可以在不同的线程中互不干扰的存储并提供数据。线程默认没有 Looper,需要创建。
系统不允许在子线程访问 UI 线程是因为 Android 的 UI 控件不是线程安全的,多线程兵法访问会造成不可预期的结果。
消息队列工作流程
- MessageQueue 消息队列包含两个操作,enqueueMessage 插入消息和 next 删除消息
- Looper 通过 Looper.prepare() 方法创建一个 Looper,接着通过 Looper.loop() 方法开启消息循环,从 MessageQueue 消息队列中去无线获取消息。消息为空时,在阻塞在 next 方法中。消息不为空时,会调用 Handler 的dispatchMessage 方法来处理消息。
- Handler 发送消息,即向 MessageQueue 中插入一条消息。