Skip to content
阅读进度

请描述 Android 主线程的消息循环机制是如何工作的? ​

返回 Java 与并发 目录

标准回答 ​

Handler 将 Message/Runnable 放进关联的 MessageQueue;Looper.loop 不断从队列取到期消息,再调用目标 Handler.dispatchMessage,最终执行 Runnable.run、Callback 或 handleMessage。主线程按队列处理任务,所以一个长任务会阻塞后续输入和绘制。

通俗例子 ​

先排进一个耗时 300ms 的任务,再排点击和绘制任务,后两者只能等。因此把任务 post 到主线程不会让它变成并行。

深入解释 ​

**三个对象怎么分工:**MessageQueue 保存待处理的消息;Looper 不断取下一项;Handler 把消息放入队列,并在分发时执行回调。Handler 通常绑定某个 Looper,自己不等于一条线程。

**post 到主线程意味着什么:**post 只是排入主线程的执行序列。前一个任务没执行完,后一个任务无法抢进来;所以把耗时函数包进 post,并没有把耗时工作变成后台工作。

易混淆点 ​

Looper.loop 的循环并非一直忙等,正常等待不等于 ANR。

参考资料 ​

内容来源 ​

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