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

这种消息处理机制主要用在不需要在消息处理中处理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);
	}
	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值