详解 Message,Handler,MessageQueue,Looper 的关系

1,378 阅读3分钟
在讲它们之间的关系前先介绍几个相关概念: 一、Message消息 1、作用:线程间通讯的数据单元,可以封装数据 2、创建:调用其静态方法Message.obtain(),直接从内部维护的消息池中获取一个已有的消息。 3、常见属性: int what : 唯一标识此消息 int arg1,arg2:Message对象可以封装的int型数据 Object obj:Message对象可以封装的Object型数据 4、简单介绍源码中相关的属性: 1)long when :每个消息的内部都记录了自己被何时处理 2) Handler target:每个消息都能记录被哪个Handler对象处理 3) Runnable callback:消息可以自己决定自己被如何处理,一般此属性为null 4) Message next:每个消息的内部都维护了一个消息对象,以此构成一个消息队列 5)private static Message sPool:要通过obtain()获得的对象 二、Handler处理器 1、作用:Handler是Message的处理器,同时也负责消息的发送和移除操作

2、发送消息

有如下四个方法,见名知意,我就不解释了

sendEmptyMessage(int what)

sendEmptyMessageDelayed(int what,long millitime)

sendMessage(Message mess)

sendMessageDelayed(Message mess,long millitime)

ps: 延迟消息是立刻发送,延迟处理 3、分发消息

消息的处理方式如上图,有三种,前两种方式优先级较高但是一般为空,通常都是调用handleMessage()处理 4、移除消息 移除指定id的消息:removeMessages(int what) 移除所有未被执行的消息: removeCallbacksAndMessages(null) 三、MessageQueue: 消息队列 1、用来存放通过Handler发送的消息 2、它是一个按Message的when排序的优先级队列。(when:代表着被处理的时间) 四、Looper循环器 1、负责循环取出MessageQueue中当前需要处理的Message 2、交给对应的Handler处理 3、处理完后将消息放到消息池中以备复用 接下来就到正题了,看看他们之间是如何协调工作的


1、通过Message.obtain()从消息池中获取一个消息对象,给相关属性赋值(what等)

2、Handler对象将消息发送出去(延迟消息是立即发送,延迟处理)

3、发送出去的消息会在MessageQueue里进行排序(按照when属性也就是处理时间排序)

4、Looper会从MessageQueue里取出消息,可能会出现阻塞(消息队列没有消息或者是最近一个消息还没到处理时间),出现阻塞时,Looper陷入沉睡(不浪费内存),到时间了,他会自己唤醒自己

5、Looper取出消息后就会调用Handler对象的dispatchMessage()方法分发消息(处理消息的方式有三种:Message的callback(为Runnable对象),Handler的callback,和Handler的handleMessage,前两种方式优先级比较高,但是很少用,一般为null)

6、Handler对象调用handleMessage方法操作 UI(在主线程)

7、消息处理完后会从消息队列中移除,Looper会负责将消息清理干净(所有属性回归原值)再放入消息池中以备复用

8、发送消息和处理消息是同一个对象