Android 子线程更新UI 异常

在Android开发中,直接在子线程更新UI通常会导致异常,但onCreate中因View未完全绘制,TextView的mLayout为null,更新不会立即重绘,避免了异常。然而,这并不意味着可以安全地进行此类操作,它不仅不优雅,而且存在安全隐患。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)将更新的代码切入到主线程中去实现UI更新。

我们来试一下,在Activity的 onCreate中直接在新线程中去更新一个TextView的文本,结果发现,WHAT?竟然没有抛出异常,更新也成功了?

这是因为在onCreate中尚未完成View的绘制,此时TextView中有个变量mLayout仍为null,setText时不执行重绘,没有运行到抛出线程异常的代码,但是相应的text却变化了。在Activity分发子View的Layout后,绘制的时变化后的text,故不抛出异常。其他View如ImageView也有类似现象出现。

如果在textview.getViewTreeObserver().addOnGlobalLayoutListener(OnGlobalLayoutListener listener)中添加监听绘制完毕的事件,然后再在子线程中更新UI,则会抛出异常。

归根结底,不能钻这个空子,不优美、不安全!

转载于:https://www.cnblogs.com/acesui/p/10153361.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值