一、基本概念:
要在子线程中使用Handler,需要先清楚Handler是如何工作的,这里我画一个简图描述下Handler的工作过程:
这里有提到4个概念:
Handler: 作为消息的发送和处理者,可以在其它线程中使用handler把消息Message存放到Looper创建时所在线程的队列MessageQure中,同时又提供方法回调来处理Looper取出来的消息;
Message:作为消息的载体,在不同的线程中,传递消息使用;
MessageQure:消息队列,存取消息;
Looper:循环机制,在Looper创建时所在线程不断轮询,取出队列MessageQure中的消息体Message,并发送给handler处理;
二、如何在子线程中使用:
1、创建Looper:
要在子线程中使用,首先需要在子线程中创建一个循环体Looper,可以使用如下代码创建Looper:
public class MyThread extends Thread {
@Override
public void run() {
super.run();
// 创建Looper对象并关联到Thread
Looper.prepare();
}
}
//Looper.prepare():
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
这里调用Looper.prepare()方法,将Looper对象绑定到当前线程Thread。
//new Looper(quitAllowed)
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mThread = Thread.currentThread();
}
Looper的构造函数中创建了队列MessageQueue。
2、创建Handler:
public class MyThread extends Thread {
private Handler handler;
@Override
public void run() {
super.run();
// 创建Looper对象并关联到Thread
Looper.prepare();
handler = new Handler(Looper.myLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
}
}
Handler的创建中,传递了当前线程Looper.myLooper()的Looper赋值给Handler。
3、启动Looper循环:
public class MyThread extends Thread {
private Handler handler;
@Override
public void run() {
super.run();
// 创建Looper对象并关联到Thread
Looper.prepare();
handler = new Handler(Looper.myLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
Looper.loop();
}
}
调用Looper.loop()方法开启一个循环,不断读取MessageQueue队列中的消息,并发送给Handler消费,关键代码如下:
for (;;) {
Message msg = queue.next(); // might block
...
try {
msg.target.dispatchMessage(msg);
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
...
}
4、对外暴露Handler调用接口:
public Handler getHandler() {
return handler;
}
至此,可以在其它线程中,调用该Handler来发送消息给到子线程来处理了。
如果喜欢我的文章就关注我吧!