Android的消息处理有四个核心类:Handler 、Looper 、Message 、MessageQueue , 都在android.os包中
一、线程的魔法师 Looper
Looper字面 意思是循环者,它被设计用来使一个普通线程变成一个Looper线程。所谓Looper线程就是循环工作的线程。在程序开发中(尤其是GUI开发中) ,经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Looper线程,使用Looper类创建Looper线程很简单,代码如下:
通过上面两行代码普通线程就编程了Looper线程,看看这两行代码都干了些什么。
1)Looper.prepare();
通过上图可以看出,现在你的线程中有了一个Looper对象,他的内部维护了一个消息队列MQ. 一个Thread只能有一个Looper对象,为什么呢,我们来看下源码
通过源码可以看出,当我们调用Looper.prepare()时,内部会检查该线程中是否存在Looper对象,如果存在就会抛出:Only one Looper may be created per thread
2)Looper.loop();
调用loop方法后,Looper线程就开始真正工作了,它不断的从自己的MQ中取出队头的消息(及任务)执行。源码如下:
从源码中我们可以看出在116行我们得到当前的线程Looper,下面两行代码是得到当前looper的MQ,在123行我们可以清楚的看到里面是一个死循环,就是不断的从MQ中取出消息处理。在124行我们取出消息队列中的消息,137行非常重要,该行是将处理工作交给message的target,即后面将到的handler, 131行是我们记录的日志信息,了解即可。154行将发送出去的消息回收掉。
除了prepare()方法和loop()方法,Looper还提供了一些比较有用的方法,如:
Looper.myLooper() 得到当前线程的Looper对象
getThread() 得到Looper对象所属线程
quit() 结束Looper循环
到此我们该对Looper有了一个大概的了解,总结一下几点:
● 每个线程最多只能有一个Looper对象,他是一个ThreadLocal
● Looper内部有一个消息队列,loop()方法调用后,开始不断的从消息队列中取出消息执行
● Looper使一个普通线程变成一个Looper线程
那么我们该如何往MQ中添加消息呢?下面就用到了我们的Handler!
二、异步处理大师 Handler
handler扮演了往MQ中添加消息和处理消息的角色(只处理有自己发送的消息),即通知MQ它要执行一个任务(sendMessage),并在loop到自己的时候执行该任务(handleMessage),整个过程都是异步的。handler创建时会关联一个looper,默认的构造方法将关联当前的looper. 默认的构造方法: