Looper、Handler、Message
2016-01-21 本文已影响59人
hello_cc
Looper
- 用于在线程上运行消息循环的
循环者
。
- Threads默认没有消息循环,线程通过调用
Looper.prepare()
,创建Looper, 然后通过调用Looper.loop()
方法处理消息,直到Looper停止。
下面就是将一个普通线程变成循环线程。即循环工作的线程,mHandler发来消息,就处理。
private class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d("LooperThread", "handleMessage " + msg.toString());
}
};
Looper.loop();
}
}
查看源码可知,Looper有自己的MessageQueue
,调用loop()
后,会执行for循环,从消息队列中取出消息执行。
一个线程只能有一个Looper
对象,即ThreadLocal。
Handler
- Handler用于发送和处理Message,并且与线程的消息队列关联。
- 每个Handler实例与一个单独的线程相关联,当你创建一个Handler,这个Handler就被绑定到
创建它的线程上
,即handleMessage处理消息的线程。 - 当消息队列处理消息的时候,Handler用于传递消息。
Handler两大使用场景
- 调度消息在未来的某个时间执行。
- 执行一个动作在不同的线程。
Message
- 用于Handler发送数据的载体。
- 尽管Message的构造方法是public的,但是最好还是调用
Message.obtain()
orHandler.obtainMessage()
,会优先从Message Pool中找,找不到再创建一个新的Message。