一、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、发送消息和处理消息是同一个对象