当前位置: 首页 > news >正文

Handler系列-怎么放入MessageQueue

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

1.MessageQueue

public final class MessageQueue {Message mMessages; //消息链表表头
}

2.Message

public final class Message implements Parcelable {/*package*/ long when;/*package*/ Message next;
}

3.sendMessageDelayed流程

  • delay加上SystemClock.uptimeMillis() 
public class Handler {public final boolean sendMessageDelayed(Message msg, long delayMillis){if (delayMillis < 0) {delayMillis = 0;}//delayMillis这里会加上SystemClock.uptimeMillis(),变成whenreturn 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的targetif (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis);}
}
  • 通过链表头mMessages和when,找到msg该在的位置(根据when从小到大排列)
public final class MessageQueue {boolean enqueueMessage(Message msg, long when) {synchronized (this) {msg.markInUse();msg.when = when; //赋值Message的whenMessage p = mMessages; //表头赋值给pboolean 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 pmsg.next = p; prev.next = msg;}// We can assume mPtr != 0 because mQuitting is false.if (needWake) {nativeWake(mPtr);}}return true;}
}

相关文章:

  • 【iOS】实现评论区展开效果
  • Java【XML 配置文件解析】
  • 高防CDN在网站搭建中的优劣势分析
  • 测试工具JMeter的使用
  • VMware安装windows操作系统
  • 面试:线上问题处理
  • 基于Springboot的冬奥会科普平台(有报告),Javaee项目,springboot项目。
  • [tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复
  • GlobalWindow和Evictor的常用组合使用
  • CANFD一次采样点和二次采样点
  • C#中警告CA1050、CA1821、CA1822、CA1859、CA2249及处理
  • 【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景
  • 2.多行输入【2023.11.24】
  • 【数据结构】二叉树概念 | 满二叉树 | 完全二叉树
  • redis的一些操作
  • 2017-08-04 前端日报
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • happypack两次报错的问题
  • HTTP那些事
  • js学习笔记
  • Meteor的表单提交:Form
  • Mysql优化
  • Redux系列x:源码分析
  • Terraform入门 - 1. 安装Terraform
  • vue:响应原理
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue总结
  • 搞机器学习要哪些技能
  • 模型微调
  • 强力优化Rancher k8s中国区的使用体验
  • 转载:[译] 内容加速黑科技趣谈
  • gunicorn工作原理
  • #pragma once与条件编译
  • ( 10 )MySQL中的外键
  • (javascript)再说document.body.scrollTop的使用问题
  • (k8s中)docker netty OOM问题记录
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (小白学Java)Java简介和基本配置
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net下的富文本编辑器FCKeditor的配置方法
  • /etc/skel 目录作用
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @软考考生,这份软考高分攻略你须知道
  • [ NOI 2001 ] 食物链
  • [20150321]索引空块的问题.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]使用Retrofit进行网络请求
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作