在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系
Message,信息的载体,用来传递数据给Handler。
Handler (Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理)
发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联。
Handler和创建它的线程绑定在一起,把 Message和Runable 对象传递给 MessageQueue,这些对象离开 MessageQueue 时,Handler 负责执行他们。
Handler有两个主要的用途:
(1)确定在将来的某个时间点执行一个或者一些 Message和Runnable 对象。
(2)在其他线程(不是 Handler 绑定线程)中排入一些要执行的动作。
post(Runnable):Runnable 在 handler 绑定的线程上执行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
sendMessage这个动作把 Message对象排成队列,这些 Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.
handlerMessage(Message)必须由 Handler 的子类来重写。
post 这个动作把 Runnable 对象排入 MessageQueue,MessageQueue 收到这些消息的时候以一定的排序执行他们
当 posting 或者 sending 到一个 Hanler 时,你可以有三种行为: 当 MessageQueue 准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现 timeout,tick,和基于时间的行为。
创建一个新进程时,主线程自带一个MessageQueue,它管理顶层的应用对象和主线程创建的窗体。
MessageQueue:(Message Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。)
包含message列表的底层类,Looper负责分发这些message。message并不是直接加到MessageQueue中,而是通过MessageQueue.IdleHandler 关联到 Looper
可以通过 Looper.myQueue()从当前线程中获取 MessageQueue
每个 message queue 都会有一个对应的 Handler。Handler 会向 messagequeue 通过
两种方法发送消息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并
按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage
发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方
法发送的是一个 runnable 对象,则会自己执行。
Looper:
Looper 类被用来执行一个线程中的 message循环。 在线程中调用 prepare()创建一个 Looper, 然后用 loop()来处理 messages, 直到循环终止。
(Looper 是 Handler 和消息队列之间通讯桥梁,程序组件首先通过 Handler 把消息传递给
Looper,Looper 把消息放入队列,它也可以取得MessageQueue里的消息,产生消息队列,传递给Handler)
大多数和 message loop 的交互是通过Handler。
下面是一个典型的带有 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();
}
}