android学习之——Handler、Looper、MessageQueue

由于android制定的规则:只运行ui线程修改activity里的ui组件。

这样新启动的线程就无法修改界面的属性,这样如果需要在新启动的线程里改变界面属性,就需要利用Handler的消息机制来做。

Handler做的事情:1、在新启动的线程里发送消息。2、在ui主线程里接收,处理消息。

MessageQueue:消息队列。

当新启动的线程发送消息,消息会送到和它关联的MessageQueue中,Handler会不断的从队列中获取消息并处理(回调消息处理方法)

void handleMessage(Message msg)处理消息、用于被重写

final boolean sendMessage(Message msg)立即发送消息

final boolean sendMessageDelayed(Message msg,long delayMillis)指定多少毫秒后发送消息

例如在一个activity里

final Handler handler = new Handler()
{
	@Override
	public void handleMessage(Message msg)
	{
		//如果消息的what属性为123
		if(msg.what==123)
		{
			//修改ui操作
			//...code
		}
	}
};
new Timer().schedule(new TimeTask()
{
	@Override
	public void run()
	{
		//发送空消息
		handler.sendEmptyMessage(123);
	}
},0,1000);

Message:Handler接收和处理的对象

Looper:每个线程中中能拥有一个Looper,负责读取消息队列中的消息,交给Handler处理

消息队列采用先进先出的方式。

Looper对象无法通过构造器创造,初始化Looper时会创建一个与之关联的MessageQueue。


消息队列由Looper管理,Handler的正常工作依赖Looper。

1)ui主线程,Looper由系统自动创建

2)  自己创建的子线程,需要手动创建Looper对象,并启动。创建后调用prepare方法(确保每个线程中只有一个Looper对象),

loop方法来启动它。

PS:

Looper.prepare();//创建线程唯一的looper

//....code Handler处理;//创建Handler,重写消息处理函数

 Looper.loop();//启动looper

PS:Looper的loop方法通过死循环方式不断从MessageQueue中取消息。



PS:不要在ui线程进行耗时运算,有可能引起ANR异常,耗时运算启动新线程运算,ui线程负责响应交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值