Handler原理

Handler的主要作用是为了实现线程间通信

Handler的整个流程中,包含了四个对象:Handler、message、messageQueue、looper
当应用创建的时候,就会在主线程中创建handler对象

我们把要发送的信息保存到message中,handler通过sendMessage方法将message发送到messageQueue中,looper对象不断的调用loop()方法不断的从messageQueue中取出message,交由handler处理。从而实现线程间通信。

主线程looper.loop()为什么不阻塞主线程?

造成ANR的原因一般有两种:
1. 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
2.当前的事件正在处理,但没有及时完成

应用启动时,在ActivityThread的main方法中就创建了一个当前主线程的looper(我们不需要手动开启looper),并开启了消息队列,消息队列是一个无限循环,应用的整个生命周期就是运行在这个消息循环中的,安卓是由事件驱动的,Looper.loop不断的接收处理事件,looper.loop一旦结束,应用程序的生命周期也就结束了,所以只能说事件的处理如果阻塞的话会导致ANR,而不能说looper的无限循环会导致ANR。

loop会不会对CPU性能有过多的消耗

在子线程创建Handler,此时由于这个线程中没有默认开启的消息队列,所以我们需要手动调用looper.prepare(),并通过looper.loop开启消息。主线程Looper从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此loop的循环并不会对CPU性能有过多的消耗。

参考文章
https://www.jianshu.com/p/d5ae223e941b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容