Android 为何onCreate中启动的子线程可更新UI,点击事件子线程更新就崩溃?
原因解析
你遇到的现象是Android UI校验机制的触发时机差异导致的:
Android的子线程更新UI校验逻辑,并不是在View的修改方法里直接触发,而是由ViewRootImpl的checkThread()方法统一校验,只有View树和ViewRootImpl完成绑定后,修改UI才会触发这个校验:
onCreate执行阶段,Activity仅完成了View树的加载,还没有将DecorView挂载到Window上,此时ViewRootImpl还没有和当前View树绑定。你在onCreate中启动的子线程Thread-2如果在绑定完成前执行了textView.text = "1"操作,不会触发线程校验,所以不会崩溃。- 等Activity走完
onResume生命周期后,系统会完成ViewRootImpl和View树的绑定,后续所有触发View重绘的操作都会先校验线程是否为主线程。你点击TextView时,绑定流程早已完成,Thread-3修改UI自然会抛出Only the original thread that created a view hierarchy can touch its views.的预期错误。
注意:这个不崩溃的现象是不稳定的,如果你给
Thread-2加上几百毫秒的延时,等ViewRootImpl绑定完成后再修改UI,一样会触发崩溃。这个是系统实现的特殊场景,绝对不能作为子线程可以更新UI的合理依据,所有UI操作都必须放到主线程执行。
内容的提问来源于stack exchange,提问作者GHH
相关产品推荐
相关产品推荐

