外观
Handler、Looper、MessageQueue 怎么配合?
标准回答
Handler 负责投递和处理消息,MessageQueue 保存待处理消息,Looper 在所属线程不断取消息并分发。任务最终在哪个线程执行,由 Handler 绑定的 Looper 决定。
关键机制
- 主线程 Looper 在框架启动时准备好;普通线程若需要消息循环,必须自己准备或使用 HandlerThread。
- post(Runnable) 也是投递消息,Runnable 在取出该消息时执行,不会因为使用 post 就自动变成后台工作。
- postDelayed 表示不早于指定时间执行;前面任务阻塞、线程未被调度都会让它更晚执行。
通俗例子
主线程正在处理一个 200ms 的任务,这时点击事件和刷新请求只能等待。把重活放进 Handler.post 只是改变执行顺序,仍会占住主线程。
易混淆点
主线程阻塞等待消息不等于卡顿。没有任务时 Looper 可以休眠;卡顿是该响应的时候没能及时响应。
参考资料
内容来源
- Android 技术札记 · 原条目
handler