这种消息处理机制主要用在不需要在消息处理中处理UI相关的操作,不会影响UI线程的流畅度.
1.HandlerThread:对消息进行处理的线程。
public class HandlerThread extends Thread {
private int mPriority;
private int mTid = -1;
private Looper mLooper;
2.Message:消息对象。
3.MessageQueue:负责对Message进行管理,是一个先进先出的管理方式.
4.Handler:负责发送Message以及处理Message,用默认的构造器创建的对象会绑定UI线程的Loop对象,用Handler(Loop lp)构造器创建的对象会绑定lp对象。
5.Loop: 负责创建一个MessageQueue对象,以及对它进行管理,负责把Handler对象(与该Loop对象绑定的Handler)发来的Message对象存放到MessageQueue对象中,
和把MessageQueue对象中的Message对象发送到Handler对象(与该Loop对象绑定的Handler)进行处理。
注:每个线程只有一个Loop,只要Handler绑定了Loop对象,那么Handler也就绑定了拥有该Loop对象的线程,
Loop对象可以通过HandlerThread对象的getLooper()方法获得。
注:Loop的部分源码
public class Looper {
final MessageQueue mQueue;
volatile boolean mRun;
Thread mThread;
在非UI线程中处理消息的例子:
/**
* 在非UI线程里对消息进行处理
* @author wuzm
*
*/
public class Test {
private class ThreadHandler extends Handler{
public ThreadHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
/*这里对消息进行处理*/
}
super.handleMessage(msg);
}
}
public Test(){
HandlerThread handlerThread = new HandlerThread("TestHandlerThread");
Looper looper = handlerThread.getLooper();
ThreadHandler handler = new ThreadHandler(looper);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}
在UI线程中对消息进行处理的例子:
/**
* 在UI线程里对消息进行处理
* @author wuzm
*
*/
public class Test {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
/*对消息进行处理*/
}
super.handleMessage(msg);
}
};
public Test(){
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}