为何在IO协程作用域更新TextView未触发崩溃?
为什么IO线程中TextView赋值不崩溃,EditText清空却崩溃?
这事儿本质是Android View系统对不同UI操作的线程检查逻辑不一样,和你对协程作用域的基础理解无关——你没错,Dispatchers.IO确实是后台线程池,不该用来做UI操作,只是有些操作的线程检查没那么“即时”。
具体原因拆解
textView.text = "Hello"不崩溃:
TextView的setText方法内部做了线程兼容处理。它会把实际的UI渲染、布局更新等线程敏感操作,通过Handlerpost到主线程执行,你在IO线程调用的只是触发了这个“转发”动作,并没有直接在后台线程修改UI核心状态,所以没触发崩溃。inputLayout.editText!!.text.clear()崩溃:Editable.clear()是直接操作EditText文本的底层数据结构(比如SpannableStringBuilder),这个操作没有线程切换逻辑,而且EditText的文本对象是线程不安全的。同时,直接修改这个数据时会触发ViewRootImpl的checkThread()检查,该检查会严格验证当前线程是否为主线程,一旦发现是后台线程就直接抛出AndroidRuntimeException。
关键提醒
别因为TextView赋值没崩溃就放松警惕,所有UI操作都必须放在Dispatchers.Main作用域下执行是Android开发的铁则。那些没触发崩溃的操作只是View内部做了兼容,不代表这种写法是对的,后续系统版本或View实现变更都可能让原本“安全”的操作突然崩溃。
内容的提问来源于stack exchange,提问作者Juan Carlos Durini
相关产品推荐
相关产品推荐

