Android Handler 机制体系

01.Handler必备知识点

  • 作用:
    • 跨线程通信。当子线程中进行耗时操作后需要更新UI时,通过Handler将有关UI的操作切换到主线程中执行。
  • 四要素:
    • Message(消息):需要被传递的消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,最终由Handler处理。
    • MessageQueue(消息队列):用来存放Handler发送过来的消息,通过 Handler 发送的消息并非是立即执行的,需要存入一个消息队列中来依次执行,内部通过单链表的数据结构来维护消息列表,等待Looper的抽取。
    • Handler(处理者):负责Message的发送及处理。通过 Handler.sendMessage() 向消息池发送各种消息事件;通过 Handler.handleMessage() 处理相应的消息事件。
    • Looper(消息泵):通过Looper.loop()不断地从MessageQueue中抽取Message,按分发机制将消息分发给目标处理者。Looper 不断从 MessageQueue 中获取消息并将之传递给消息处理者(即是消息发送者 Handler 本身)进行处理。
  • 具体流程
    • Handler.sendMessage()发送消息时,会通过MessageQueue.enqueueMessage()向MessageQueue中添加一条消息;
    • 通过Looper.loop()开启循环后,不断轮询调用MessageQueue.next();
    • 调用目标Handler.dispatchMessage()去传递消息,目标Handler收到消息后调用Handler.handlerMessage()处理消息。
    • image

02.Handler作用与功能

  • Handler主要有两个用途:
    • 首先是可以定时处理或者分发消息
    • 其次是可以添加一个执行的行为在其它线程中执行

03.MessageQueue作用与功能

  • MessageQueue作用主要包含2个操作:插入和读取。
    • 读取操作会伴随着删除操作,插入和读取对应的方法分别为enqueueMessage和next,其中enqueueMessage的作用是往消息队列中插入一条消息,而next的作用是从消息队列中取出一条消息并将其从消息队列中移除。
  • 虽然MessageQueue叫消息队列,但是它的内部实现并不是用的队列。
    • 实际上它是通过一个单链表的数据结构来维护消息列表,单链表在插入和删除上比较有优势。

04.Looper作用与功能

  • Looper作用与功能
    • Looper类主要用于一个线程循环获取消息队列中的消息。Looper的作用主要是负责管理消息队列,负责消息的出列和入列操作。

05.Message作用与功能

  • 什么是Message
    • android.os.Message是定义一个Messge包含必要的描述和属性数据
  • 此对象可以被发送给android.os.Handler处理。
    • 会关联到一个handler,handler就是处理其中的消息。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
  • 属性字段:arg1、arg2、what、obj、replyTo等;
    • arg1和arg2是用来存放整型数据的;
    • what是用来保存消息标示的;
    • obj是Object类型的任意对象;
    • replyTo是消息管理器

06.消息机制实现的步骤

  • 所谓的消息机制其实很简单,实现这种机制需要只需要四步:
    • 1、实例化Looper(因为实例化Handler时需要一个looper);
    • 2、实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息;
    • 3、实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象);
    • 4、调用Handler的sendMessage方法把实例化好的Message对象发送出去。
  • 简单的消息机制概述
    • 实现Message机制需要Handler、Message、Looper三个之间的互相作用来实现;当线程A需要发消息给线程B的时候,线程B要用自己的Looper实例化Handler类,就是构造handler对象时,把当前线程的Looper传给Handler构造函数,handler本身会保存对Looper的引用,handler构造好以后,就可以用handler的obtainMessage方法实例化Message对象,只要把要传的数据给Handler,Handler就会构造Message对象,并且把Message对象添加到消息队列里面。然后就可以调用handler的sendMessage方法把Message对象发送出去,Looper就把消息放到消息队列中;最后当Looper知道消息队列不为空时候,就会循环的从消息队列中取消息,取出消息就会调用刚才实例化好的Handler对象的handleMessage方法取处理消息,整个Message过程就是这样。