Handler系列-怎么放入MessageQueue

链表:根据when从小到大排列

1.MessageQueue

java 复制代码
public final class MessageQueue {
    Message mMessages; //消息链表表头
}

2.Message

java 复制代码
public final class Message implements Parcelable {
    /*package*/ long when;
    /*package*/ Message next;
}

3.sendMessageDelayed流程

  • delay加上SystemClock.uptimeMillis()
java 复制代码
public class Handler {
    public final boolean sendMessageDelayed(Message msg, long delayMillis){
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        //delayMillis这里会加上SystemClock.uptimeMillis(),变成when
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }


    public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        MessageQueue queue = mQueue;
        return enqueueMessage(queue, msg, uptimeMillis);
    }

    
    private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this; //赋值Message的target
        if (mAsynchronous) {
            msg.setAsynchronous(true);
        }
        return queue.enqueueMessage(msg, uptimeMillis);
    }
}
  • 通过链表头mMessages和when,找到msg该在的位置(根据when从小到大排列)
java 复制代码
public final class MessageQueue {
    boolean enqueueMessage(Message msg, long when) {
        synchronized (this) {
            msg.markInUse();
            msg.when = when; //赋值Message的when
            Message p = mMessages; //表头赋值给p
            boolean needWake;
            if (p == null || when == 0 || when < p.when) {
                //链表为null或者when为0或者when的值比表头的when小
                // New head, wake up the event queue if blocked.
                msg.next = p;
                mMessages = msg; //msg成为表头
                needWake = mBlocked;
            } else {
                Message prev;
                for (;;) {
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {//找到该放的位置了
                        break;
                    }
                }
                //插入msg:prev msg p
                msg.next = p; 
                prev.next = msg;
            }

            // We can assume mPtr != 0 because mQuitting is false.
            if (needWake) {
                nativeWake(mPtr);
            }
        }
        return true;
    }
}
相关推荐
小墙程序员2 小时前
一文了解 Android 5 到 16 期间跨进程通信(IPC) 的使用
android·android studio
雨白4 小时前
Android 自定义 View 基础:布局流程详解
android
leon_teacher4 小时前
HarmonyOS权限管理应用
android·服务器·前端·javascript·华为·harmonyos
Just_Paranoid6 小时前
【AOSP】Android Dump 开发与调试指南
android·adb·service·dumpsys
独行soc8 小时前
2025年渗透测试面试题总结-38(题目+回答)
android·安全·网络安全·面试·职场和发展·渗透测试·求职
做一位快乐的码农9 小时前
原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现
android
Amber_379 小时前
深入理解Go 与 PHP 在参数传递上的核心区别
android·golang·php
_祝你今天愉快10 小时前
Android FrameWork - 开机启动 SystemServer 进程
android
洞见前行11 小时前
Android第一代加固技术原理详解(附源码)
android·安全
CYRUS_STUDIO11 小时前
深入解析 dex2oat:vdex、cdex、dex 格式转换全流程实战
android·源码·逆向