前言
学安卓的都接触过Handler,许多老java项目中也有很多使用Handler进行网络通讯,或许现在我们都用kotlin,用协程,但咱也不能就把Handler忘了,本篇文章特此巩固Handler相关知识
是什么
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。(也就是异步操作) 这种机制通常用来处理相对耗时比较长的操作(例如网络操作等)。
作用
Handler类的主要作用有两个。
- 在新启动的线程中发送消息。
- 在主线程中获取、处理消息。
方法介绍
上面的说法看上去很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取并处理消息。但这个过程涉及两个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?这个时机显然不好控制。
为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现–开发者只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息-这将导致Handler类中处理消息的方法被回调。
Handler类包含如下方法用于发送、处理消息。
- handleMessage(msgMessage):处理消息的方法。该方法通常用于被重写。 hasMessages(what:Int):检查消息队列中是否包含what属性为指定值的消息。
- hasMessages(what:Intobject:Any):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
- 多个重载的Message obtainMessage():获取消息。 sendEmptyMessage(whatLong):发送空消息。
- sendEmptyMessageDelayed(whatLongdelayMillisLong):指定多少毫秒之后发送空消息。
- sendMessage(msg:Message):立即发送消息。
- sendMessageDelayed(msg:MessagedelayMillisLong):指定多少毫秒之后发送消息。借助于上面这些方法,程序可以方便地利用Handler来进行消息传递。
Handler、Loop MessageQueue的工作原理
为了更好地理解Handler的工作原理,下面先介绍一下与Handler一起工作的几个组件。
-
Message:Handler接收和处理的消息对象。
-
Looper:简单来说: 每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的
消息,读到信息之后就把消息交给发送该消息的Handler进行处理。复杂点来说:Looper用于为线程运行消息循环。默认情况下,线程没有与其关联的消息循环;要创建一个,请在要运行循环的线程中调用prepare,然后循环让它处理消息,直到循环停止。 -
MessageQueue:消息队列,它采用先进先出的方式来管理Message程序创建Looper对象时,会在它的构造器中创建MessageOueue对象。
在线程中使用Handler(Looper使用示例)
步骤如下:
- 调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的
构造器会创建与之配套的MessageQueue。 - 有了Looper之后,创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息。
- 调用Looper的loop)方法启动Looper。
代码示例:
class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler(Looper.myLooper()) {public void handleMessage(Message msg) {// 在此处处理传入消息};Looper.loop();}}
参考
百度百科
疯狂Android讲义(kotlin版)