一般使用Handler发送消息的流程是这样的:
//新建Handler对象
Handler h = new Handler() {
@Override
public void handleMessage(Message msg) {
//处理逻辑
}
};
//发送消息
h.sendMessage(msg);
使用无参构造方法创建Handler对象时,会调用如下方法
public Handler(Callback callback, boolean async) {
//省略代码
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
首先通过Looper.myLooper()获取当前线程的Looper对象,在主线程中直接创建Handler对象时一切正常,因为主线程中已经存在Looper实例,在上篇文章中已做介绍。如果在子线程中创建对象的话,必须先通过Looper.prepare()在本线程中创建Looper对象。
通过上面的代码可以发现,一个Handler对象对应新建该Handler对象线程的一个Looper,而一个Looper对象对应一个MessageQueue对象