Handler 和 Looper操作在UI线程里为什么不会阻塞UI线程

Handler ,Looper,MessageQueue,Message 关系简单理解就是:

一个线程(包含UI线程,通过ThreadLocal) 对应着一个Looper,一个Looper对应着一个MessageQueue,Message是存储在MessageQueue里面的 , 一个Looper 可以对应多个Handler,一个Handler对应着一个Looper。

关于上面三者关系可以去查相关源码,或者看下面推荐的几篇博客:

https://www.jianshu.com/p/9e4d1fab0f36 

https://www.cnblogs.com/yxysuanfa/p/7125761.html


了解上面的关系之后,知道 new Handler的时候 总是有会一个Looper,这个Looper在不停的循环取消息,然后调用消息对应的handler执行消息的方法去执行,那么问题来了,为什么在UI线程里,这个消息循环不会阻塞UI线程呢?

下面一个例子:在子线程中使用Handler,自己调用 Looper.prepare() 和 Looper.loop()


下面是结果:


这个结果说明,Looper.loop() 方法执行之后,也就是消息循环开始了,这个时候,线程就会卡住了,一直在执行消息循环,那么我们的UI线程为什么不会出现阻塞呢?

参考了https://blog.csdn.net/cao126197103/article/details/51316725,看了源码,

原来在UI线程里,UI的操作(包括刷新UI等)都是在mainHandler里进行操作的,也就是说UI线程中,某些代码块的执行也是通过Handler发消息来执行的。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值