我们都知道“Android系统不能在子线程中更新UI”
下面我们一块揭开他的真面目。
直接原因:
如果在子线程中更新了,会怎么样?
一定会出现这样的一条log
Only the original thread that created a view hierarchy can touch its views.
知道这个log是谁打的吗?
ViewRootImpl -> checkThread()
我们来看一下该方法
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
"Only the original thread that created a view hierarchy can touch its views.");
}
}
在每一次UI更新时,均会触发checkThread 方法,所以无法在子线程中更新UI的直接原因。
根本原因
Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。
那么为什么系统不对UI控件的访问加上锁机制呢?
缺点有两个:
1.加上所机制会让UI访问的逻辑变的复杂;
2.锁机制会降低UI访问的效率,因为所机制会阻塞某些线程的执行。
如果你是系统的设计者,您应该怎么处理?
google采用了最贱的最简单的做法—-单线程处理模型来处理UI操作。