消息机制原理

Post on Nov 04, 2021 by Wei Lin

概述

Handler机制介绍

Android中的消息机制又被称为Handler机制。用于同一进程的各个线程之间进行通信。

Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队列,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行。


当其它进程需要与应用程序进行交互时,如ActivityManagerService加载Activity和Service、处理广播时,会通过Binder进程间通信机制来通知应用程序。应用程序接收到这个请求时,它不是马上就处理这个请求,而是将这个请求封装成一个消息,然后把这个消息放在应用程序的消息队列中去,然后再通过消息循环来处理这个消息。

这样做的好处就是消息的发送方只要把消息发送到应用程序的消息队列中去就行了,它可以马上返回去处理别的事情,而不需要等待消息的接收方去处理完这个消息才返回,这样就可以提高系统的并发性。实质上,这就是一种异步处理机制。

Android线程

一个Android应用程序中至少有一个进程,进程中至少有一个线程,但有时候会需要衍生一个线程做一些后台工作。因为用户界面必须很快地响应用户的操作,所以Activity所在的线程不应该做一些耗时的操作如I/O操作等,任何不可能在短时间完成的操作应该分配到别的线程。


线程在代码中是用标准的Java线程对象创建的,Android提供了一些方便的类来管理线程——Looper用于在线程中运行消息循环、Handler用于处理消息、HandlerThread用于设置一个消息循环的线程。

Handler机制成员

(1) 消息:Message

消息(Message)代表一个行为(what)或者一串动作(Runnable),每一个消息在加入消息队列时,都有明确的目标(Handler)。


(2) 消息队列:MessageQueue

以队列的形式对外提供插入和删除的工作,其内部结构是以链表的形式存储消息的。


(3) Looper

Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给目标(Handler)处理。

MessageQueue是Looper内部使用的,对于标准的SDK,用户是无法实例化并使用的。


(4) Handler

消息的真正处理者,具备获取消息、处理消息、移除消息等功能。一个线程需要一个Handler对象才能处理来自其它线程的消息。


(5) 线程

线程,CPU调度资源的基本单位。Android中的消息机制也是基于线程中的概念。


一个Thread可以拥有多个Handler实例,Handler 只是发送和执行任务逻辑的入口和出口,该线程中的Looper可以初始化线程中的多个Handler。

一个Thread只对应一个Looper,每个Looper都有一个MessageQueue对象,同时Handler也有该MessageQueue对象的引用,每个MessageQueue中有N个待处理消息,Message依赖于Handler来进行处理。

处理流程

Android中应用程序是靠消息驱动来,其大致工作原理为:

  • 消息队列:事件源向消息队列中投递消息,根据优先级加入队列的不同位置;
  • 消息循环:处理线程从消息队列中取出消息并处理


在Android中,以上工作主要由Looper和Handler来实现。


Handler机制可以简述为:

Handler使用sendMessage(msg)将Message发送到Looper的消息队列中(即MessageQueue),等待Looper.loop()的循环读取Message,处理Message,然后调用Message的target,即附属的Handler的dispatchMessage()方法,将该消息回调到handleMessage()方法中,然后完成更新UI操作。