我们都知道“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操作。
本文深入解析Android系统不允许在子线程中更新UI的直接与根本原因,并探讨了系统设计者可能采取的最优处理方式。通过分析ViewRootImpl->checkThread()方法,揭示了禁止子线程更新UI背后的机制,同时阐述了不使用锁机制的原因及其缺点。最后,提出Google采用的单线程处理模型作为解决这一问题的策略。
1913

被折叠的 条评论
为什么被折叠?



