欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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()核心方法

  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

相关标签: android