Android Handler概述

一 MessageQueen 消息队列

在Android中,一个线程对应一个Looper对象,而一个Looper对象又对应一个MessageQueen。MessageQueen用于存放Message,,在MessageQueen中,存放的消息按照FIFO原则执行。

二 Looper 循环者

Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueen。默认情况下,Android中新创建的线程是没有开启消息循环的。但是主线程除外,系统自动为主线程创建Looper对象,开启消息循环。所以在主线程中应用下列代码创建Handler对象时,就不会出错;而如果在新创建的非主线程操作中,应用下列代码创建Handler对象,就会报错

Handler handler = newHandler();
如果想要在非主线程中创建Handler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建这个Handler对象,再使用Looper类的loop()方法启动Looper,从消息队列里获取和处理消息。


public class LooperThread extends Thread{
	public Handler handler1;		//声明一个Handler对象
	@Override
	public void run(){
		super.run();
		Looper.prepare();			//初始化Looper对象
		//实例化一个Handler对象
		handler1 = new Handler(){
			public void handlerMessage(Message msg){
				Log.i("Looper",String.valueOf(msg.what));
			}
		};
		//获取一个消息
		Message m = handler1.obtainMessage();
		m.what=0x11;
		handler1.sendMessage(m);
		Looper.loop();
	}
}
在MainActivity的OnCreatef()方法中,创建一个LooperThread线程,并开启该线程。

LooperThread thread = new LooperThread();
thread.start();
Looper类提供的常用方法如下

方法描述
prepare()用于初始化Looper
loop()Looper线程开始工作,从消息队列中获得和处理消息
myLooper()获得当前线程的Looper对象
getThread()获得Looper对象所属的线程
quit()结束Looper循环

注意:写在Looper.loop()之后的代码不会被执行,这个函数内部是一个循环,当调用Handler.getLooper().quit()方法后,loop()方法才会终止,其后面的代码才能运行。

三 Handler  消息处理类

Handler类允许发送和处理Message或Runnable对象到其所在线程的MessageQueen中。主要有以下两个主要作用。

1.将Message或Runnable应用post()方法或sendMessage()方法发送到MessageQueen中,在发送时可以指定延迟时间,发送时间或者要携带的Bundle数据。当MessageQueen循环到该Message时,调用相应的Handler对象的handlerMessage()方法对其进行处理。

2.在子线程中与主线程进行通信,也就是在工作线程中与UI线程进行通信。

说明:在一个线程中只能有一个Looper和MessageQueen,但是可以有多个Handler,而且这些Handler可以公用Looper和MessageQueen

Handler提供的常用方法

handlerMessage(Message msg)处理消息的方法,一般重写该方法,在发送消息时,该方法会自动重调
post(Runnable r)立刻发送Runnable对象,该Runnable对象最后将被封装为Message对象
postAtTime(Runnable r,long uptimeMillis)定时发送Runnable对象,该Runnable对象最后将被封装为Message对象
postDelayed(Runnable r,long uptimeMillis)延时发送Runnable对象,该Runnable对象最后将被封装为Message对象
sendEmptyMessage(int what)发送空消息
sendMessage(Message msg)立即发送消息
sendMessageAtTime(Message msg,long uptimeMillis)定时发送消息
sendMessageDelayed(Message msg,long uptimeMillis)延时发送消息
  

四 Message 消息类

Message被存放在MessageQueen中,一个MessageQueen中可以包含多个Message对象,每个Message对象可以通过Message.obtain()或者Handler.obtainMessage()方法获得。一个Message对象有如下属性

属性类型描述
arg1int用来存放整型数据
arg2int用来存放整型数据
objObject用来存放发送给接收器的Object类型数据
replyToMessage用来指定此Message发送到任何处的可选Message对象
whatint用于指定用户自定义的消息代码,这样接收者可以了解这个消息的信息
说明:使用Message类的属性可以携带int类型的数据,如果要携带其他类型的数据,可以先将要携带的数据保存到Bundle中,然后通过setData()方法将其添加到Message中。

综上所属,在使用Message时需要注意以下几点:

1.尽管Message有public的默认构造方法,但是通常情况下,需要使用Message.obtain()或Handler.obtainMessage()方法来从消息池中获得空消息对象,节省资源。

2.如果一个Message只需要携带简单的int类型信息,应优先使用Message.arg1和Message.arg2来传递信息,这比Bundle更节省内存。

3.尽可能使用Message.what来标识信息,以便使用不同的方式来处理Message。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值