android的消息队列很重要,应用开发几乎都要和它打交道。
涉及的四个主要的类:
Handler :消息队列的对外接口,接触最多
Message:队列中的节点
MessageQuene:提供enquene() , next()等方法
Looper:顾名思义,循环的从队列中取出可处理的消息,如果没有可处理的消息则暂停线程
建立消息队列
class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } }
上面代码就是在新的线程中建立消息队列,主线程中这个步骤系统已经提前做好了。
1.Looper.prepare()这行代码做了两件事:
.创建一个looper对象并保存到线程本地存储中(使用ThreadLocal,非线程间共享)
.创建一个MessageQuene对象
2.这之后使用Handler的默认构造方法创建的Handler对象都是引用的本线程的looper对象
3.Looper.loop()这个方法其实就是执行一个死循环,不停调用MessageQuene的next()方法取出队列头部的Message对象
并进行消息分发。
其它
1.消息的进队和出队操作都用synchronized加了锁,来确保消息队列的线程安全
2.消息安照when字段指定的时间排序
3.当没有消息可执行时调用了底层native方法暂停线程,暂停时间由消息可执行时间而定
4.同步屏障(synchronization barriers) 和 异步消息