You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:57:02