MessageQueue
消息队列MessageQueue是以执行时间为序的优先级队列,先发送的消息先执行
Message只是一段数据,里面说明了要做什么,但并不知如何做。Message放入队列后,在处理这些消息时到底怎么做?这就引入了Handler
Hanlder
Handler对消息队列的enqueueMessage做了包装,同时,把Message的target设成了自己,即为Message指定执行的行为,这样当前Message被处理的时候就会调用Handler的dispatchMessage,而这个函数就会调用你要实现的虚函数handlerMessage。经过消息队列转了一圈,还是调用自己实现的函数,但是同步操作变成了一步操作。
Looper
Message放在消息队列里,这时Looper会调用自己的loop函数一直循环处理队列中的消息,直到遇上一个没有target的Message。由此可见Looper总是和一个MessageQueue关联起来
Thread
loop只是一个函数,它也需要别人来执行它。由于它一执行就会阻塞在那里,所以一定需要一个线程来调用
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler(){
public void handlerMessage(Message msg){
}
};
Looper.loop();
}
}
一个Looper也总是和一个Thread关联起来,不过不一定要创建新线程,可以是主线程的。Handler和Thread不是一一对应的,理论上,在一个LooperThread中,可以有任何多个Handler,每个消息都可以指定不同的Handler,因为每个消息都有不同的Handler,因为每个消息都可以有不同的行为。
在创建Handler时并不会创建Thread,它只取当前线程的Looper的MessageQueue