android消息机制,源码解析说明
程序员文章站
2022-06-15 20:30:34
消息机制Mseeage:消息线程间通信的数据单元,通过message携带需要的数据创建对象:Message.obtain(what)Message 源码解析...
消息机制
Mseeage:消息
线程间通信的数据单元,通过message携带需要的数据
创建对象:Message.obtain(what)
Message 源码解析
基本属性说明
int wat;标识id
int arg1;保存int数据
int arg12;保存int数据
public Object obj;保存任意数据
long when;记录应该被处理的时间值 用来在MessageQueue的排序
Handler target;用来处理消息的Handler对象,发送消息的handler
Runable callback;用来处理消息的回调器,可以传给分线程执行Thread的构造方法
Message next;指向下一个messsage 用来形成一个链表
Message sPool;用来缓存处理过的Message 最多50个
Message obtain();利用Message中消息池
Handler:处理器
Handler是Message的处理器,同时也负责消息的发送合移除的工作
发送即时消息:sendMessage(Message msg)
发送延时消息:sendMessageDelayed(Message msg,long time)
处理消息:handleMessage(Message msg) 回调方法
移除还未处理的消息:removeMessages(int what)
Handler 源码分析
发送即时消息:sendMessage(Message msg)本质调用的时发送延迟为0的消息
当前时间+延迟时间,获得发送时间,然后将消息添加到队列,保存发送消息的Handler到Message
MessageQueue:存储消息的以when排序优先级队列
enqueueMessage(Message msg,long when);
将message添加到消息队列中指定该消息被处理的时间,通过无线for循环的方式按照执行时间进行有序排列
nativeWake() 通过本地方法实现底层需要唤醒的线程
Looper 从MessageQueue中获取当前需要处理的消息,并交给Handler处理
loop()核心方法
- 先是得到消息队列对象,然后进行无限for循环,通过next()函数从消息队列中取出要执行的Message消息对象,如果取不到执行的本地方法会进入等待。
- messages.next() 会执行 nativePollOnec() ; 本地方法,如果没有需要处理的消息,会导致进入等待状态,虽然是主线程执行,但是调用的是底层的本地方法所以不会阻塞主线程,相当于是一个饿汉式操作
- 没有进入等待的话,获取到Message消息对象,执行message绑定的Handle对象进行事件分发。
- 如果message有自己的callback,自己的处理方法就会调用HandleCallack()方法执行message的callback.run();结束
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
//如果message有自己的callback,自己的处理方法就会调用HandleCallack()方法执行message的callback.run();结束
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
- else 进入会判断内部接口Callback有没有被实现,如果实现了就走内部的callback下面的HandlerMessage返回true和fals,true结束方法,false就继续向下执行调用Handler下的handlerMessage()来处里。
- 最后调用recycle 清空初始化message携带的数据,放回消息池。
本文地址:https://blog.csdn.net/qq_40053337/article/details/107948548
上一篇: 回家百度去