Skip to content
阅读进度

Handler、Looper、MessageQueue 怎么配合? ​

返回 Java 与并发 目录

标准回答 ​

Handler 负责投递和处理消息,MessageQueue 保存待处理消息,Looper 在所属线程不断取消息并分发。任务最终在哪个线程执行,由 Handler 绑定的 Looper 决定。

关键机制 ​

  • 主线程 Looper 在框架启动时准备好;普通线程若需要消息循环,必须自己准备或使用 HandlerThread。
  • post(Runnable) 也是投递消息,Runnable 在取出该消息时执行,不会因为使用 post 就自动变成后台工作。
  • postDelayed 表示不早于指定时间执行;前面任务阻塞、线程未被调度都会让它更晚执行。

通俗例子 ​

主线程正在处理一个 200ms 的任务,这时点击事件和刷新请求只能等待。把重活放进 Handler.post 只是改变执行顺序,仍会占住主线程。

易混淆点 ​

主线程阻塞等待消息不等于卡顿。没有任务时 Looper 可以休眠;卡顿是该响应的时候没能及时响应。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。