Android消息机制中主要涉及的几个概念包括Handler、Looper、MessageQueue以及Message

Handler

Handler作为消息的生产者以及发送者存在
handler.sendMessage
handler.post
这两种方法是handler常用的发送消息的方法。 发送参数的本质都是一个message,在handler.post时的传参runnable实际上是作为message的一个callback对象存在
注:handler的不当使用很容易造成内存泄露(由于生成对象时会默认应用当前的应用,所以该对象最好使用弱引用)

Looper

Looper从我的理解来看是消息机制中的搬运工兼职消费者
looper.prepare()
在这个方法中,prepare()生成并且绑定了一个messagequeue,同时将该Looper同所在的线程进行一一绑定。最后以这个looper为值存入到ThreadLocal中方便后面的获取
注:主线程的looper不允许退出,且是以一个静态变量sMainLooper缓存在Looper中
looper.loop()
该方法从消息队列中获取msg并且通知msg的callback进行回调处理
注:looper.loop()方法是一个死循环,却不会卡死线程。 是因为,如果当前消息队列中并无消息,queue.next()会调用native的pullonce()并且通过linux的epoll机制进入等待并且释放资源,同时通过eventFd监听msg的写入来唤醒。因此并不会导致线程卡死
注1:线程的进入looper.loop()的死循环时,线程实际上仍处于runnable状态,只不过CPU资源被释放

MessageQueue

messageQueue是消息机制中message的集装箱,所有消息都会根据插入消息的时刻以及delay这个传参来决定在集装箱中的排序。遵循先入先出规范(除非有同步消息或者插到队头)
enqueueMessage()
根据传入消息的时刻以及when来确定消息在消息队列中的排序,消息队列依次出队先入的消息
next()
正常情况下根据消息队列中消息的排序依次获取
当存在同步屏障时,即msg.target被置为空时,next()方法会跳过该消息之前的所有同步消息,优先执行该异步消息(使用场景:屏幕刷新)