Handler消息传递机制

Android系统从4.0版本开始,就不允许在主线程(即UI线程)中进行访问网络、大数据计算等耗时操作了。为解决这个问题,我们需要借助Handler消息机制来实现了。

Handler类的主要作用有两个:

1、  在新启动的线程中发送消息

2、  在主线程中获取、处理消息

整个过程涉及到一个问题:新启动的线程何时发送消息?主线程何时获取并处理消息?

为了让主线程“适时”处理子线程发送的消息,只能通过回调的方式-------重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断的从MessageQueue中获取并处理消息--------这样导致Handler中消息处理的方法被回调。

Handler类常用的发送、处理消息的方法:

void handleMessage(Message msg):   处理消息的方法。通常被重写

final boolean hasMessage(int what):  检查消息队列中是否包含what属性为指定值的消息

final boolean hasMessage(int what,Object obj): 检查消息队列中是否包含what属性及obj属性为指定对象的消息

多个重载的Messge  obtainMesssage(): 获取消息

sendEmptyMessage(int what): 发送空消息

final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定时间(单位为毫秒)后发送空消息

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

final boolean sendMessageDelayed(Message msg,long delayMillis):指定时间(单位为毫秒)后发送消息

Handler、Loop、MessageQueue的工作原理

各组件功能描述如下:

Message:Handler 接受和处理的消息对象

Looper: 每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到消息后就将消息交给发送该消息的Handler进行处理

MessageQueue:消息队列,采用先进先出的方式管理Message。程序创建Looper对象时会在他的构造器中创建MessageQueue对象

Handler:发送和处理消息。程序使用Handler发送消息,被Handler发送的消息必须被送到指定的MessageQueue。MessageQueue是由Looper负责管理。在主线程中,系统默认初始化一个Looper对象,因此直接创建Handler用于发送消息、处理消息即可;在子线程中必须通过Looper.preapre方法自己创建一个Looper对象用于子线程的MessageQueue维护。

各组件的作用:

Looper:每个线程只有一个Looper,负责管理MessageQueue,会不断从MessageQueue中取消息,并将消息分给对应的Handler处理

MessageQueue:由Looper负责管理。采用先进先出的方式管理Message。

Handler:把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。

使用步骤:

1、  调用Looper的prepare方法创建Looper对象及MessageQueue

2、  有了Looper后创建Handler子类的实例,重写handlerMessage()方法负责处理被Looper分到的消息

3、  调用Looper的loop方法启动Looper

参考《疯狂Android讲义  第2版》

原文地址:https://www.cnblogs.com/PeijueerOrJacking/p/4422511.html