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()

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

下面是结果:

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

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

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

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

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