1.Looper是什么?
Looper在线程间通信中扮演消息循环的角色,不停的从MessageQueen中查看是否有新消息,如果有就会立即处理,没有则一直阻塞。Handler的工作需要Looper,如果没有Looper线程会报错,使用Looper.prepare();为当前线程创建一个Looper,Looper.loop();用来开启消息循环。
注意:Looper属于线程,不属于Handler,在线程中Handler和Looper、MessageQueen是属于N(Handler):1(Looper):1(MessageQueen)关系
2.Looper的实现原理
1、Looper类里包含有一个MessageQueen和一个Thread对象。当创建Looper时,Looper会自动创建一个MessageQueen并将内部线程对象指向创建Looper的线程。
//Looper的构造函数
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);//创建消息队列
mThread = Thread.currentThread();//默认绑定创建Looper的线程
}
2、使用Looper.loop();开启消息循环,不断遍历MessageQueen,,没有消息则阻塞,有消息则回调Handler的handlerMeaasge方法进行处理。
注意:写在Looper.loop();之后的代码不会被执行,因为Looper是一个死循环,只有调用handler.getLooper.quit();后,looper终止,才会执行。
3.Looper.prerare()
Looper对象内部包含了一个空MessageQueen和一个空线程,通过Looper.prepare()让新建一个MessageQueen,让空线程指向当前线程,从而实现绑定。ThreadLocal调用set方法,将当前线程通过关联ThreadLocalMap间接的关联Looper实例,实现绑定。
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
4.主线程中的Looper.loop()一直无限循环为什么不会造成ANR
应用程序启动时,主线程会自动创建Looper,而自动创建Looper的Looper.prepareMainLooper();方法,在ActivitThread的main方法里执行。Activity的main方法主要就是做消息循环,一旦退出消息循环,应用也就退出了。Looper.loop()不断的执行事件(也就是我们所写的代码),所以就算Looper.loop()一直无限循环,也不会造成ANR。