在讲它们之间的关系前先介绍几个相关概念: 一、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、分发消息
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、发送消息和处理消息是同一个对象