☰
第146篇View.post 为什么能拿到宽高:与 Handler 的关系
2026/10/11 9:20:00 网站建设 项目流程

先把结论放在前面:View.post能拿到宽高,是因为它的 Runnable 被挂到了主线程消息队列的尾部,而performTraversals(measure → layout → draw)是在当前这一轮消息处理中同步完成的。换句话说:post出去的 Runnable 排在"下一帧"执行,而布局是在这一帧内做完的——所以回调里view.width已经是最终值。

这题是"看过资料"和"写过代码"的分水岭。前者的回答停在"post是在消息队列里,下一帧才执行"这句结论;后者的回答里有执行路径、有数据流向、有失败模式——比如为什么view.post在子线程调用会崩、为什么未 attach 的 Viewpost的任务永不执行、为什么post里读宽高仍可能是 0。能主动说出失败模式,才算答出深度。

时序:为什么"下一帧"就有宽高

Android 的界面更新走的是请求式遍历——invalidate/requestLayout只是打标记(mPrivateFlags上置位并设置PFLAG_DIRTY),真正的工作由ViewRootI

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询