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;
    }
}
相关推荐
jzlhll1232 小时前
android10~16变更一览和开发者兼容应对
android
monkey_lqd4 小时前
QT for Android环境搭建
android
LoserChaser8 小时前
Android—服务+通知=>前台服务
android
Wgllss8 小时前
完整案例:Kotlin+Compose+Multiplatform之桌面端音乐播放器,数据库使用实现(三)
android·架构·android jetpack
2501_916008899 小时前
iOS混淆工具有哪些?在集成第三方 SDK 时的混淆策略与工具建议
android·ios·小程序·https·uni-app·iphone·webview
2501_915921439 小时前
Windows 如何上架 iOS 应用?签名上传全流程 + 工具推荐
android·ios·小程序·https·uni-app·iphone·webview
小小琪_Bmob后端云12 小时前
【Trae实践】直播间自动发言工具的开发
android·ai编程·trae
叽哥14 小时前
flutter学习第 2 节:第一个 Flutter 应用
android·flutter
2501_9160074714 小时前
iOS 文件管理实战指南 查看 App 数据与系统日志的完整方法
android·ios·小程序·https·uni-app·iphone·webview
余辉zmh15 小时前
【MySQL基础篇】:MySQL常用内置函数以及实用示例
android·mysql·adb