您的位置:首页 > 产品设计 > UI/UE

HandlerThread、Loop、MessageQueue、Handler、Message组成的Android的消息处理机制

2013-07-20 16:48 471 查看
这种消息处理机制主要用在不需要在消息处理中处理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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐