Handler
Handler用来处理消息
Handler的三种处理消息方式的原理
成员:
final Looper mLooper;
final MessageQueue mQueue;
final Callback mCallback;
final boolean mAsynchronous;
IMessenger mMessenger;
构造方法:
1,初始化自己的Callback callback
2,初始化异步消息状态mAsynchronous
3,初始化Looper,子线程需要的时候才创建传递looper
4,初始化messageQueue,通过Looper获取mQueue
消息创建
obtainMessage获取消息本质调用Message.obtain()(享元设计模式)
消息发送
postXXXX()
sendXXXXMessage()
handler将消息放入到MessageQueue
消息消费分发
dispatchMessage方法:面向对象封装原则分发消息
message消费顺序,Message自己callback->Handler自己callback->Handler#handleMessage
1,Message#callback:Handler#postXXX(Runnable)方法,给message设置callback
2,Handler#callback: Handler创建对象传入
3,Handler#handleMessage:默认实现,子类要实现该方法处理message
执行流程
Handler-->Looper-->MessageQueue-->message
Looper
1、在线程内创建Looper#prepare方法创建线程
初始化MessageQueue
记录当前线程Thread
2、执行轮训Looper#loop --->循环取消息MessageQueue#next
Message==null(Looper#quitSafely)退出,否则会阻塞
Message!=null派发消息Message#target#dispatchMessage(Message);
Message#recycleUnchecked释放消息将消息放入链表池
3、线程执行结束退出Looper#quitSafely执行MessageQueue#quit
MessageQueue
存储有时间顺序的Message链表
封装native方法与native通信传递消息
主要成员
Message mMessages;//当前第一个执行的Message,也是时间顺序链表头
存储消息
MessageQueue#enqueueMessage 存储在时间顺序的Message链表
取消息
MessageQueue#next
- 如果有消息
- <= 当前时间,打断链表,取出消息
- > 当前时间,未来消息,计算时间差值并延时阻塞等待
- 如果没有消息
阻塞等待
Message消息
实现了Parcelable接口
内部核心成员
/*package*/ long when;//消息时间戳
/*package*/ Bundle data;//数据
/*package*/ Handler target;//发送消息的Handler,基本不等于null
/*package*/ Runnable callback;//消息的自己处理回调
/*package*/ Message next;//链表下一位
public static final Object sPoolSync = new Object();//同步
private static Message sPool;//链表池子
private static int sPoolSize = 0;//链表池子个数
private static final int MAX_POOL_SIZE = 50;//最大长度
获取消息
Message#obtainXXX
存入链表池子
Looper#loop -> Message#target#dispatchMessage(Message) ->Message#recycleUnchecked
网友评论