第146篇View.post 为什么能拿到宽高:与 Handler 的关系

发布时间:2026/10/11 9:20:07
第146篇View.post 为什么能拿到宽高:与 Handler 的关系 先把结论放在前面: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