Android 中子线程真的不能更新 UI 吗?
先说结论:Android 中子线程在满足一定的条件下可以更新 UI。
- 在 ViewRootImpl 还没创建出来之前
- UI 修改的操作没有线程限制。
- 在 ViewRootImpl 创建完成之后
- 保证「创建 ViewRootImpl 的操作」和「执行修改 UI 的操作」在同一个线程即可。也就是说,要在同一个线程调用 ViewManager#addView 和 ViewManager#updateViewLayout 的方法。
- 注:ViewManager 是一个接口,WindowManger 接口继承了这个接口,我们通常都是通过 WindowManger(具体实现为 WindowMangerImpl) 进行 view 的 add remove update 操作的。
- 对应的线程需要创建 Looper 并且调用 Looper#loop 方法,开启消息循环。
- 保证「创建 ViewRootImpl 的操作」和「执行修改 UI 的操作」在同一个线程即可。也就是说,要在同一个线程调用 ViewManager#addView 和 ViewManager#updateViewLayout 的方法。