Activity、WM,WMS、ViewRootimpl、Window的关系图
-
如上图ViewRootImpl是连接view和window的桥梁事务
-
管理和触发View的绘制
-
触摸事件的中转
-
负责和WMS通信
1.Activity启动过程中ViewRootImpl创建后开启如下的线程检查,mThead是UI主线程实例,Thead.currentThread()是当前任务线程。如果不是主线程触发UI更新会触发Exception。
2.而ViewRootImpl的创建在ActivityThread#handleResumeActivity之后,即只要ViewRootImpl不创建的话,子线程更新UI的动作并不会报错,这也是为什么大家在onCreate和onStart时序中加载一些子线程回调后更新UI,并不是100%会报错的原因,取决于子线程创建和逻辑处理的速度。
3. 综合以上,Android系统子线程并不是不能更新UI,但是如果UI展示给用户后还选择多线程去同时更新UI,必然带来多线程同步和安全等问题,加锁等行为也会带来UI绘制的卡顿等问题,所以Android系统优先处理用户行为,优先UI绘制,提高用户界面响应的优先级选择在主线程去统一处理用户事件和UI刷新。
参考: