Skip to content
阅读进度

invalidate 和 requestLayout 的区别? ​

返回 View 与显示链路 目录

标准回答 ​

invalidate 表示内容需要重绘;requestLayout 表示尺寸或布局可能变化,需要重新评估测量和布局。例如只改进度条颜色通常重绘即可,改文本大小或布局尺寸通常需要重新布局。

机制解释 ​

频繁 requestLayout 会增加布局工作,但影响范围取决于具体 View 树和框架优化。大量小更新应考虑合并。setSelected、setMargins 等涉及已使用中的 UI 状态和布局变更,应在主线程完成;修改 LayoutParams 后要通过正确途径触发布局更新。

延伸追问 ​

子线程能否画 UI?可以后台计算数据、生成适合离屏处理的结果,但不能任意并发修改页面 View 树。postInvalidate 也只是安排重绘,不让其他 View 操作自动变安全。

内容来源 ​

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