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版》