(1) Handler的作用是把消息加入特定的Looper所管理的消息队列中,并分发和处理消息队列中的消息。每个handler都和一个looper关联,Looper负责管理线程的消息队列并启动消息循环(消息队列是一个单链表实现的)。
(2)Looper在创建的时候会调用prepare()生成一个looper对象,并且一个线程只能创建一个looper对象,在looper的构造方法里会创建一个消息队列,所以一个线程有唯一的一个消息队列。之后looper调用loop()循环消息队列,每取出一个message,就把这个message发送给对应的handler。
(3) Handler在创建的时候可以指定一个Looper对象,如果不指定就利用当前线程的Looper对象和handler关联。Handler通过调用sendMessage()、或者post(Runnable)(把Runnable对象赋值给了message的callback属性)可以把message插入到跟handler关联的Looper的消息队列中,插入的时候给message的Target属性赋值为当前的handler;looper进入消息循环后,通过消息队列的next()方法获取到message后,根据message.target属性,调用dispatchMessage(msg),把message传递给对应的handler,之后handler回调handleMessage()或者Runnable的run()方法,处理消息。
(4)应用启动的时候就已经为主线程创建了Looper,并且调用了loop(),如果要在子线程中创建消息队列和消息循环的话,要先调用prepare()创建消息队列,再调用loop()进入消息循环。
附加:looper.loop()中是死循环,主线程为什么没有阻塞?
参考:
http://mp.weixin.qq.com/s?__biz=MzI0MjE3OTYwMg==&mid=2649548084&idx=1&sn=9091f6c33d37a9fb082ac74b8628b478
http://blog.csdn.net/qq_32583189/article/details/52253147
消息传递机制、源码参考:
http://blog.csdn.net/liuhe688/article/details/6407225/
http://blog.csdn.net/lmj623565791/article/details/38377229
http://www.cnblogs.com/xsyulinzi/p/4323662.html
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html