当前位置: 移动技术网 > 移动技术>移动开发>Android > android消息机制,源码解析说明

android消息机制,源码解析说明

2020年08月14日  | 移动技术网移动技术  | 我要评论
消息机制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()核心方法

  1. 先是得到消息队列对象,然后进行无限for循环,通过next()函数从消息队列中取出要执行的Message消息对象,如果取不到执行的本地方法会进入等待。
  2. messages.next() 会执行 nativePollOnec() ; 本地方法,如果没有需要处理的消息,会导致进入等待状态,虽然是主线程执行,但是调用的是底层的本地方法所以不会阻塞主线程,相当于是一个饿汉式操作
  3. 没有进入等待的话,获取到Message消息对象,执行message绑定的Handle对象进行事件分发。
  4. 如果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);
        }
  1. else 进入会判断内部接口Callback有没有被实现,如果实现了就走内部的callback下面的HandlerMessage返回true和fals,true结束方法,false就继续向下执行调用Handler下的handlerMessage()来处里。
  2. 最后调用recycle 清空初始化message携带的数据,放回消息池。

本文地址:https://blog.csdn.net/qq_40053337/article/details/107948548

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网