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;
    }
}
相关推荐
雨白6 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk6 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING6 小时前
RN容器启动优化实践
android·react native
恋猫de小郭9 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker14 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴14 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos