转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/73484527
本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛 即可关注
上一篇总结了一下Handler的基本用法,但是对于其原理并不太清楚,这篇主要分析下其内部的原理。看一下其源码是怎么回事,从源码的角度理解Handler机制,Handler、Looper、MessageQueue之间的关系。
1 简介 |
先对这几个类做一下简单介绍。
Handler:
线程间通信的方式,主要用来发送消息及处理消息。
Looper:
为线程运行消息循环的类,循环取出MessageQueue中的Message;消息派发,将取出的Message交付给相应的Handler。
MessageQueue:
存放通过Handler发过来的消息,遵循先进先出原则。
Message:消息,线程间通信通讯携带的数据。
例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程
2 Looper |
源码路径:frameworks/base/core/java/android/os/Looper.java
Looper主要工作:
- 自身实例的创建,创建消息队列,保证一个线程中最多有一个Looper实例。
- 消息循环,从消息队列中取出消息,进行派发。
Looper用于为线程运行消息循环的类,默认线程没有与它们相关联的消息循环;如果要想在子线程中进行消息循环,则需要在线程中调用prepare(),创建Looper对象。然后通过loop()方法来循环读取消息进行派发,直到循环结束。
程序中使用Looper的地方:
- 主线程(UI线程)
UI线程中Looper已经都创建好了,不用我们去创建和循环。 - 普通线程
普通线程中使用Looper需要我们自己去prepare()、loop()。
看一下普通线程中创建使用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();
}
}
这段代码是Looper源码注释中给的典型列子,主要步骤:
- Looper 准备,(Looper实例创建);
- 创建发送消息、处理消息的Handler对象;
- Looper开始运行。
印象中在UI线程没有出现过Looper相关的东东,这是因为UI线程中会自动创建Looper对象并进行消息循环,我们不再需要调用Looper.prepare()和Looper.loop(),但是在子线程中如果想要创建使用Handelr则需要向如上所示。
我们通过源码看一下Looper实例创建的方法:
public static void prepare() {
prepare(true);
}
private static void prepare(bool