文章目录
一、Android为什么不能在子线程更新UI?
viewRootImpl
对象是在Activity
中的onResume
方法执行完成之后,View
变得可见时才创建的,之前的操作是没有进行线程检查的,所以没有报错。但是ViewRootImpl
创建之后,由于进行了checkThread
操作,所以就不能在子线程更改UI
了。
当访问 UI
时,ViewRootImpl
会调用 checkThread
方法去检查当前访问 UI
的线程是否为创建 UI
的那个线程,如果不是。则会抛出异常。
当然可以,从系统源码的角度来解释为什么 Android 中子线程不能直接更新 UI。
ViewRootImpl
的创建
在 Android 应用的生命周期中,ViewRootImpl
对象是在 Activity
的视图变得可见时被创建的。ViewRootImpl
是负责管理视图层次结构、处理测量、布局和绘制的核心类。
ActivityThread.java
中的 handleResumeActivity
方法是一个关键点: