文章目录
- 一、Android为什么不能在子线程更新UI?
- 二、为什么Android中要设计为只能在UI线程中去更新UI?
- 三、如果不在UI线程中更新UI,可能会出现什么问题呢?
- 四、ViewRootImp是在onActivityCreated方法后面创建的吗?
- 五、为什么一开始在Activity的onCreate方法中创建一个子线程访问UI,程序还是正常能跑起来呢
- 1. Activity 生命周期概述
- 2. 视图层次结构的初始化
- 3. 子线程访问 UI 的时机
- 4. 潜在问题
- 正确的做法
- 六、Android中子线程真的不能更新UI吗?
- 6.1 满足两个条件
- 6.2 保证上述条件1成立不就可以避免checkThread时候抛出异常了吗?为什么还需要开启消息循坏?
- 条件2如何保证UI正确更新和绘制
- 6.3 示例代码
- 七、在实际开发中,如何将子线程的任务结果传递到UI线程进行更新?
- 七、使用子线程更新UI有实际应用场景吗
- SurfaceView 刷新UI的机制
- 使用子线程刷新UI的示例
- 主要要点
- 八、扩展阅读
一、Android为什么不能在子线程更新UI?
viewRootImpl
对象是在Activity
中的onResume
方法执行完成之后,View
变得可见时才创建的,之前的操作是没有进行线程检查的,所以没有报错。但是ViewRootImpl
创建之后,由于进行了checkThread
操作,所以就不能在子线程更改UI
了。
当访问 UI
时,ViewRootImpl
会调用 checkThread
方法去检查当前访问 UI
的线程是否为创建 UI
的那个线程,如果不是。则会抛出异常。
当然可以,从系统源码的角度来解释为什么 Android 中子线程不能直接更新 UI。
ViewRootImpl
的创建
在 Android 应用的生命周期中,ViewRootImpl
对象是在 Activity
的视图变得可见时被创建的。ViewRootImpl
是负责管理视图层次结构、处理测量、布局和绘制的核心类。
ActivityThread.java
中的 handleResumeActivity
方法是一个关键点:
public void