外观
请描述 Android 主线程的消息循环机制是如何工作的?
标准回答
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。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
4.1.1