Skip to content
阅读进度

如何理解setSelected setMargins 和 findViewById 必须在主线程吗? ​

返回 View 与显示链路 目录

标准回答 ​

对于已经挂载到 UI 的 View,我会在其所属 UI 线程修改状态和布局。setSelected 可能影响 drawable 状态与界面刷新,修改 margins 并设置 LayoutParams 会影响布局,因此应放在 UI 线程。findViewById 是查找操作,本身不直接触发绘制,但读取正在变化的 View 树也不应随意跨线程。后台线程适合准备数据和纯计算,再把结果交回 UI 线程。未挂载对象的构建有特殊条件,不能把它推广为已经显示的 View 可以任意跨线程操作。

延伸追问 ​

没有抛 CalledFromWrongThreadException 不等于这次跨线程访问就有线程安全保证。

内容来源 ​

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