Android设计主线程更新UI的根本原因

334 阅读1分钟

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刷新。

参考:

www.cnblogs.com/huansky/p/1…

blog.csdn.net/yg409653786…