handler消息机制 小结

一、为什么要用Handle这样的机制:
因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。
为了解决这一个问题,android制定了一条规则:只允许UI线程来修改UI组件的属性等,如果在UI界面进行一个耗时的操作。就会出现ANR异常。
这些耗时操作要写在一个子线程里。这时候就需要线程间的通信。

而线程间的通信是通过消息机制实现的。

二、消息机制中几个比较重要的角色

1.Message:
Message:消息的载体,用于表示消息的内容,内部可以携带少量的信息,用于线程间交换数据。

2.Handler:消息的发送者,和消息的处理者

3.MessageQueue:
消息队列。是用来存放所有通过Handler发送的消息。然后等待被处理。每个线程只会有一个MessageQueue

4.Looper:
主要负责消息机制的运转,是MessageQueue的管家。每当发现MessageQueue中有消息就会将他取出然后传递到handlerMessage中。每个线程也只有一个Looper对象。

--------------------------

要发送消息,首先要有消息。
如何创建消息的对象:

Message msg = Message.obtain();
在消息中封装信息
msg.what=0;
msg.arg1=2;

handler.sendMessage(msg);
----------------------------
上面两句可以写成一句:
Message msg = Message.obtain(h,what,arg1,arg2);

Message msg = Message.obtain(handler,0,2);
msg.sendToTarget();
-----------------------------
另一种创建消息对象的方法
通过Handler对象的obtainMessage()获取消息对象,这个方法实际上也是通过Message的obtain()
方法实现的。
Message msg = handler.obtainMessage(what, arg1, arg2, obj)
handler.sendMessage(msg);
-------------------------------
处理消息的时候,写一个类继承Handler这个类,重写方法
public void handleMessage(Message msg){
}
-------------------------------
三、Handler执行的过程

总结1:

Android启动时,会创建一个主线程,主线程初始化第一个Handler时,会创建Looper.

Looper是与主线程一一对应的,每个线程只有一个Looper。系统会默认初始化一个Looper
对象,负责管理MessageQueue.
Handler在工作线程发送消息的时候,Looper会接受这个消息。这个消息会放在消息队列里。
然后Looper又会分发这个消息。UI线程接受到Looper分发的消息,然后在handlerMessage(Message msg)

这个方法里,处理消息。

总结2:

首先我们在主线程中创建一个Handler对象并重写handlerMessage方法,当我们需要在子线程中更新UI的时候,需要创建一个Message并且发送。

这个消息就会被添加到MessageQueue消息队列中,然后Looper会一直从MessageQueue中取出待处理的消息,并分发到Hander的handlerMessage中。

因为Handler是在主线程中创建的,所以这时候handlerMessage也是在主线程中的。我们就可以在这里进行UI操作。




这个过程就是发送消息,接受消息的过程。

                       


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值