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;
    }
}
相关推荐
御坂嘀喵24 分钟前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android·gitee
浮江雾39 分钟前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
风和先行1 小时前
Android 数据库相关学习总结
android·数据库·学习
杉氧1 小时前
Compose 渲染内核 (3):Slot Table 与 Gap Buffer —— 极速重组的数学艺术
android·架构·android jetpack
阿巴斯甜2 小时前
ContentObserver的使用:
android
casual_clover2 小时前
【Android 控件】使用 Navigation 实现底部导航功能时左右滑动退出页面功能
android·底部导航滑动退出
urkay-2 小时前
Kotlin Flow分类
android·开发语言·kotlin
阿pin3 小时前
Android随笔-MVC/MVP/MVVM/MVI
android·mvc·mvvm·mvp·mvi
阿pin3 小时前
Android随笔-View绘制流程
android·开发语言·view
2501_916008893 小时前
iOS 证书管理最佳实践 从创建到续期的完整指南
android·ios·小程序·https·uni-app·iphone·webview