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性能有过多的消耗。
网友评论