外观
如何理解setSelected setMargins 和 findViewById 必须在主线程吗?
标准回答
对于已经挂载到 UI 的 View,我会在其所属 UI 线程修改状态和布局。setSelected 可能影响 drawable 状态与界面刷新,修改 margins 并设置 LayoutParams 会影响布局,因此应放在 UI 线程。findViewById 是查找操作,本身不直接触发绘制,但读取正在变化的 View 树也不应随意跨线程。后台线程适合准备数据和纯计算,再把结果交回 UI 线程。未挂载对象的构建有特殊条件,不能把它推广为已经显示的 View 可以任意跨线程操作。
延伸追问
没有抛 CalledFromWrongThreadException 不等于这次跨线程访问就有线程安全保证。
内容来源
- Android Framework 知识手册 · 原条目
5-11