子线程修改UI

1、在checkThread()判断之前完成了对UI的操作

Activity的onCreate方法里面子线程为何能设置UI界面

  • 在onCreate()的时候可以直接开启子线程更新UI,但是这是有局限性的,因为Activity的onResume之前ViewRootImpl实例没有建立,所以没有ViewRootImpl.checkThread检查,故躲避了子线程不能更新UI的异常报错

2、View的高度在修改前后保持不变

震惊!Android子线程也能修改UI?(第二篇)

3、子线程更新UI的几种方式

  • 通过runOnUiThread()方法更新UI
  • 通过Handler的post()方法更新UI
  • 通过Handler的sendMessage()方法
  • 通过View的post()方法更新UI
  • 总结:最后都有调用到Hanlder#sendMessageDelayed()方法
  • ps:Handler#obtainMessage()
    • 从消息池中返回了一个Message对象,如果消息池为空再创建一个新的消息

4、View.post和Handler.post的区别

  • View.post 最终也是通过 Handler.post 来执行消息的,执行过程如下:

    • 如果在 performTraversals 前调用 View.post,则会将消息进行保存,之后在 dispatchAttachedToWindow 的时候通过 ViewRootImpl 中的 Handler 进行调用。
    • 如果在 performTraversals 以后调用 View.post,则直接通过 ViewRootImpl 中的 Handler 进行调用。
      View.post()源码
  • mAttachInfo是ViewRootImpl首次触发performTraversals传进来的。即,触发之后,View.post通过ViewRootImpl内部的Handler进行处理;触发之前,通过RunQueue进行处理

  • 参考资料:微信公众号:异步 Handler 十大必问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值