Looper:
其作用在于把线程和消息队列绑定,创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息
MessageQueue:
是一种 数据结构,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。
创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。
主线程创建时,会创建一个默认的Looper对象。
其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。其函数源码如下:
public static final void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(true));
}
从上源码知,一个线程只能有一个Looper。
Looper的构造方法源码如下:
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mRun = true;
mThread = Thread.currentThread();
}
Looper对象的创建,将自动创建一个Message Queue。
下面是API中提供的示例代码:
prepare用来运行looper,然后调用loop方法循环的从消息队列中取出消息。
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();
}
}
Handler:
对应于每个Looper,与之绑定,具体来处理消息队列中的消息。
一般Handler的构建如下
handler的默认构造方法就会获取并保存当前线程下的Looper对象,并获取这个Looper实例对象保存的MessageQueue
Handler handler = new Handler(Looper.myLooper())
这里说下handler下的两种方法:
sendMessage(Message msg)
sendMessageDelayed(Message msg, long delayMillis)
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what, long delayMillis)
通过查看源码,我们知道前两种方法都是调用后面的Delayed,只是dalayMills设置为0.
Message:
对于一个Message实例对象,只能被handler发送一次。
这里有篇讲此Message机制比较好的博文
http://blog.csdn.net/lmj623565791/article/details/38377229