android 子线程更新UI

1. 为啥android子线程不可更新UI?
我们可以想象下多线程更新UI会出现什么场景。比如多线程对一个view同时设置位置,那么到界面的显示上用户可能就会看到这个view在界面上上下左右的闪现,晃眼啊。
2. 什么情况下子线程可以更新UI?
我们先看下子线程更新UI的报错在这里插入图片描述
这是在子线程中更新TextView的内容,可以看出报错是在调用view的requestLayout之后发生的,说明可能是控件位置变化后导致检查线程问题,那布局未变化的情况下能否更新UI呢?
答案是可以的。
为了不改变控件的位置,我们将TextView的宽度设置为match_parent,这时如果在子线程中修改TextView的内容,只要内容不会导致换行是可以修改成功的,因此子线程中修改UI,只要不会触发view的requestLayout方法是可以修改UI的。

还一种情况下也可以修改UI,就是在Activity的onResume之前进行修改。因为检查线程方法是通过ViewRootImpl实现的,而ViewRootImpl在onResume时才创建。
参考:[https://www.cnblogs.com/billshen/p/13328680.html]

子线程中可以使用补间动画,因为补间动画并没有实际改变控件位置。

UI还涉及到dialog和toast,而子线程想要使用dialog和toast,需要启用looper,因为dialog和toast的需要通过handler才能正常运行,大家可通过查看源码了解一下。
3. 子线程更新UI的几种方式。
runonuithread
view.post
handler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值