02. Message源码分析
2022年4月12日
02. Message源码分析
handler是如何执行的
handler 可以发送和处理线程的---> MessageQueue关联的Message和Runnable对象。
hanlder实例与单个线程和该线程的消息队列相关联
当创建一个新的Handler时,他会绑定到一个Looper,他将消息和runnable传递到Looper的消息队列并在该Looper的线程上执行他们
主要用途
- 安排message和Runnable在未来某个时间点执行
- 排队等待一个动作,在不同于自己的线程上执行
post和sendMessageAtTime
- post允许在接收到Runnable对象时被消息队列调用。
- sendMessage允许将数据包的Messager对象放入队列,该数据包被Handler的HandlerMessager方法处理(需要实现Handler的子类)
发送消息的方式
立即发送
基于时间的发送行为
如时钟变化,超时,定时
进程创建时运行消息队列
当为您的应用程序创建一个进程时,它的主线程专用于运行一个消息队列,该队列负责管理顶级应用程序对象(活动、广播接收器等)以及它们创建的任何窗口。 您可以创建自己的线程,并通过 Handler 与主应用程序线程进行通信。 这是通过调用与以前相同的 <em>
post</em>
或 <em>
sendMessage</em>
方法来完成的,但来自您的新线程。 然后,给定的 Runnable 或 Message 将被安排在 Handler 的消息队列中,并在适当的时候进行处理。
post
也是sendMessage,不过会从Message.Obtain()获取Message,将Message.callback=传入的runnable。在未来某个时间点执行。
Handler初始化
- 指定Looper。 外部初始化Looper对象? 做了什么
- 默认持有 Looper.mQueue 引用
- mCallback Handler.Callback
- mAsynchronous ?
Handler dispatchMessage()分析
callback为不为空-> handleCallback else handleMessage()
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
Handler.handlerCallback()
message.callback.run()
Handler.handlerMessage()
/**
*子类实现handlerMessage方法
*/
public void handleMessage(@NonNull Message msg) {
}