Handler及相关的理论知识

前言

学安卓的都接触过Handler,许多老java项目中也有很多使用Handler进行网络通讯,或许现在我们都用kotlin,用协程,但咱也不能就把Handler忘了,本篇文章特此巩固Handler相关知识

是什么

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。(也就是异步操作) 这种机制通常用来处理相对耗时比较长的操作(例如网络操作等)。

在这里插入图片描述

作用

Handler类的主要作用有两个。

  1. 在新启动的线程中发送消息。
  2. 在主线程中获取、处理消息。

方法介绍

上面的说法看上去很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取并处理消息。但这个过程涉及两个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?这个时机显然不好控制。
为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现–开发者只要重写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使用示例)

步骤如下:

  1. 调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的
    构造器会创建与之配套的MessageQueue。
  2. 有了Looper之后,创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息。
  3. 调用Looper的loop)方法启动Looper。
Created with Raphaël 2.3.0 Thread Looper.prepare() Handler Looper.loop()

代码示例:

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

猜你喜欢

转载自blog.csdn.net/shop_and_sleep/article/details/132409489