我们知道,如果在子线程中更新 UI,那么程序就会抛出异常。 ViewRootImpl 的 checkThread 方法会对操作 UI 的线程做验证,异常也是由此抛出,代码如下所示:
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
"Only the original thread that created a view hierarchy can touch its views.");
}
}
Android 的 UI 控件不是线程安全的,如果在多线程中并发访问可能会导致 UI 控件处于不可预期的状态。如果对 UI 控件加上锁机制,会使 UI 访问的逻辑变得复杂,而且锁机制会降低 UI 的访问效率。所以最简单高效的方法就是采用单线程来管理 UI ,于是 Google 给开发者提供了 Handler 来从任意子线程切换到 UI 线程。
Handler 具体实现细节详见《Android Handler 流程分析与思考》。