完整教程:从 C 链表到 Android Looper:MessageQueue 的底层原理一条线讲透

news/2026/1/18 16:18:05/文章来源:https://www.cnblogs.com/gccbuaa/p/19498673

前言:为什么要从 C 链表讲起?

很多 Android 开发者都用过 Handler / Looper / MessageQueue
但一深入源码就会觉得“抽象、复杂、难以下手”。

其实问题不在 Android,而在于我们没把底层模型串起来

如果你愿意退回一步,用 C 语言最基础的数据结构视角 去看,就会发现:

Android 的消息机制,本质就是:
链表 + 队列 + 排序 + 阻塞循环。

本文尝试做一件事:
 从 C 语言的链表出发,一步一步推导到 Android 的 MessageQueue / Looper
把这条逻辑链完整走一遍。

一、指针的本质:一切从“地址”开始

在 C 语言中:

int x = 10;
int *p = &x;
  • x 是一个值
  • &x 是 x 的内存地址
  • p 是一个存地址的变量
  • *p 表示“通过地址访问那块内存里的值”

指针 = 存地址的变量

这是后面所有数据结构的根基。

这一点非常重要,因为:

  • 链表
  • 队列
  • MessageQueue
  • Looper

全部建立在“地址关系”之上。

二、为什么需要 struct?

单个变量无法表达复杂对象,我们需要把“相关数据”组织在一起:

struct Person {int age;int height;
};

struct 的本质只是:
 一块内存的布局说明书

它本身并不负责逻辑。

三、Node:链表的最小原子结构

链表的核心是 Node

typedef struct Node {void *data;        // 指向真实数据struct Node *next; // 指向下一个节点
} Node;

这里有两个完全不同层次的指针:

  • data业务数据指针

  • next结构关系指针

一句话总结:

Node = 数据 + 指向下一个 Node 的关系

多个 Node 通过 next 串起来,就形成了链表:

Node1 -> Node2 -> Node3 -> NULL

四、为什么“只有 Node”是没用的?

此时会遇到一个致命问题:

 从哪里开始遍历?

链表必须有一个“入口”,也必须有人维护整体状态。

五、Queue:Node 的管理者(系统思维的起点)

于是我们引入“管理结构”:

typedef struct {Node *head;Node *tail;int   size;
} Queue;

现在结构关系变成:

Queue├── head ──> Node ──> Node ──> Node ──> NULL├── tail ────────────────────────────┘└── size

注意一个非常重要的事实:

Queue 自己不存数据,它只负责“管理 Node 的关系”。

这是从“数据结构”走向“系统设计”的第一步。

六、为什么 Queue* 不需要二级指针?

初始化 Queue 通常这样写:

Queue q;
queue_init(&q);
void queue_init(Queue *q) {q->head = NULL;q->tail = NULL;q->size = 0;
}

这里:

  • q 本体已经存在(在栈上)

  • 函数只是修改 Queue 内部字段

  • 并没有修改指针变量本身

所以:
 一级指针足够

七、什么时候才需要二级指针?

只有一种情况:

当函数需要“创建 / 替换一个指针变量本身”

void create_queue(Queue **pq) {*pq = malloc(sizeof(Queue));
}

调用方式:

Queue *q = NULL;
create_queue(&q);

这里的本质是:

  • q 是一个 Queue* 指针变量

  • &q 的类型是 Queue**

  • Queue** 正好能“接住” &q

  • *pq = malloc(...) 本质是给 q 重新赋值

 二级指针的本质是“类型匹配 + 写回指针变量”

八、从 Queue 到 MessageQueue:关键差异只有一个

普通 Queue 是 FIFO

Android 的 MessageQueue 不一样,它是:

按执行时间排序的消息队列

因此 Node 演化为 Message:

typedef struct Message {long when;              // 什么时候执行void (*callback)(void); // 要执行的任务struct Message *next;
} Message;

你会发现:

  • 结构没变

  • 指针没变

  • 只是数据字段更“业务化”

九、MessageQueue 的核心职责

MessageQueue 主要做三件事:

  1. 按 when 有序插入 Message

  2. 维护单向链表

  3. 提供 next() 获取“当前可执行的消息”

它不是简单的队列,而是“时间有序链表”。

十、Looper:系统的“心跳循环”

Looper 的逻辑可以简化成一句话:

for (;;) {Message *msg = queue.next();dispatch(msg);
}

也就是说:

Looper = 无限循环 + 从 MessageQueue 取消息并执行

这就是 Android UI 线程的“发动机”。

十一、为什么 Looper 不会空转卡死?

关键在 MessageQueue.next()

  • 如果队列为空

  • 或最近一条消息还没到执行时间

 线程进入阻塞状态

当:

  • 新消息入队

  • 或时间到达

 线程被唤醒

因此:

next() ≠ pop()
next() = “能执行才返回,否则阻塞等待”

这是系统层设计的精髓。

十二、完整映射关系一览

C 世界Android 世界
NodeMessage
next 指针Message.next
QueueMessageQueue
for(;;)Looper.loop()
阻塞等待native poll / wake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1178674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu1059 多重背包

import java.util.Scanner;public class hdu1059 {//01背包public static boolean bag(int[] weight,int[] value,int V){int[] res = new int[V+1];for (int i = 0; i < weight.length; i++) {for (int j = V; j &…

国产时序数据库 2026 图鉴:金仓的融合创新与赛道演进方向

前言 进入2026年&#xff0c;在“数字中国”与工业物联网浪潮的强劲推动下&#xff0c;国产时序数据库市场持续繁荣&#xff0c;竞争格局日趋清晰。本文将对当前主流的国产时序数据库进行梳理盘点&#xff0c;并特别聚焦于金仓数据库&#xff08;Kingbase&#xff09;&#xff…

hdu1059 多重背包

import java.util.Scanner;public class hdu1059 {//01背包public static boolean bag(int[] weight,int[] value,int V){int[] res = new int[V+1];for (int i = 0; i < weight.length; i++) {for (int j = V; j &…

RPM打包进阶:mock与rpmbuild的宏定义传递及spec文件自定义宏实践

在Linux软件包管理领域&#xff0c;RPM&#xff08;Red Hat Package Manager&#xff09;凭借其强大的构建和分发能力成为主流解决方案。本文将深入解析mock和rpmbuild工具中宏定义的传递机制&#xff0c;结合spec文件自定义宏的实践方法&#xff0c;为开发者提供系统化的RPM打…

2026食品级流量计优选:实力厂家质量保障指南,过热蒸汽流量计/插入式双文丘里/压力变送器,食品级流量计公司怎么选购 - 品牌推荐师

在食品饮料、生物制药、乳制品等关乎民生健康的行业中,流量计作为过程控制与物料计量的关键仪表,其重要性不言而喻。食品级流量计不仅需要满足基础的流量测量精度与稳定性,更需符合严格的卫生标准,如易于清洁、防止…

基于Python+django+vue3的高校大学生网上选课网站的设计与实现

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息技术的发展&#xff0c;高校教务管理逐步向数字化、智能化转型。传统的线下选课方式存在效率低、资源分配不均等问题&…

2026年宁波地区AI搜索推广公司排名,这些靠谱企业值得关注 - 工业品牌热点

2026年,浙江AI+产业融合发展进入攻坚阶段,AI搜索推广与智能引流系统已成为中小企业破解获客难、转型慢痛点的关键抓手。无论是生成式引擎优化(GEO)驱动的精准获客,还是AI智能体全场景赋能,优质AI搜索推广公司的专…

2025年市面上评价高的汽车微动开关实力厂家哪里有,电动推杆微动开关/小型微动开关/防水微动开关直销厂家哪里有 - 品牌推荐师

新能源赛道下的微动开关技术竞争与市场格局 随着新能源汽车渗透率突破40%,汽车电子系统对高可靠性微动开关的需求呈现爆发式增长。作为汽车座椅调节、车窗控制、电池管理系统等核心模块的关键组件,微动开关的性能直接…

2026最新贵州实景还原家装公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评,实景还原工艺助力品质家居生活 - 品牌推荐2026

引言 随着居住需求升级,家装行业已从单纯装修转向"所见即所得"的实景还原时代,但设计与落地脱节、工艺标准缺失等问题仍普遍存在。据中国建筑装饰协会2025年度报告显示,全国家装实景还原达标率仅58%,超6…

收集自己的每日早餐类型(包子,豆浆,面包),统计各类型的食材占比,输出营养早餐搭配建议

1. 实际应用场景描述场景某上班族希望改善早餐习惯&#xff0c;记录每日早餐类型&#xff08;如包子、豆浆、面包等&#xff09;&#xff0c;并统计各类型的食材占比&#xff0c;从而分析营养结构&#xff0c;获得科学的早餐搭配建议。痛点- 手动记录早餐种类繁琐- 难以量化不同…

学习unigui【45】UnimDatePicker等按钮汉化崩溃

学习unigui【45】UnimDatePicker等按钮汉化崩溃UnimDatePicker等按钮汉化会导致程序崩溃。1 function afterCreate(sender)2 {3 try{4 var pkr = sender.getPicker && sender.getPicker();5 if(!pkr) retu…

压箱底的华润万家购物卡别浪费!3 个靠谱渠道盘活沉睡资产 - 可可收

你家是不是也有一张被遗忘的华润万家购物卡?明明是实打实的消费额度,却被搁置成了 “沉睡资产”。超 68% 的消费者手中至少躺着 1 张闲置购物卡,人均年均闲置金额高达 800 元。其实不用愁,选对回收渠道,这些卡就能…

宏智树 AI:ChatGPT 学术版驱动的全流程学术创作智能引擎

在人工智能深度赋能学术研究的新时代&#xff0c;如何高效攻克论文写作从选题构思到答辩定稿的全链路难题&#xff0c;成为科研人、高校师生的核心诉求。宏智树 AI&#xff08;官网www.hzsxueshu.com&#xff0c;微信公众号搜一搜 “宏智树 AI”&#xff09;应势而生&#xff0…

2026最新贵州改善型装修公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评,品质工艺双优助力品质家居生活 - 品牌推荐2026

引言 随着人们生活水平的提升,改善型住房需求日益增长,改善型装修市场也迎来了新的发展机遇。消费者在追求居住空间舒适与美观的同时,对装修的实用性、工艺质量和服务体验提出了更高要求。然而,当前装修行业存在设…

为什么棒球教练穿队服?

棒球教练穿队服的背后&#xff1a;规则、传统与战术的三重逻辑棒球教练&#xff08;包括主教练、助理教练、投手教练等&#xff09;身着队服指挥比赛&#xff0c;并非单纯的风格选择&#xff0c;而是棒球运动的规则要求、历史传统延续、战术执行需要共同作用的结果&#xff0c;…

金亿高举钻机可以信任吗?其实力怎样? - 工业品牌热点

2026年基建工程领域持续升级,高效安全的护坡锚固设备已成为边坡防护、隧道加固等工程突破施工瓶颈的核心支撑。无论是复杂地形的适应性、高空作业的安全管控,还是设备的性价比与后期维护,优质设备服务商的技术实力与…

微信立减金放着过期?聪明人早已悄悄这样做! - 京顺回收

临近年底,不少人翻看微信卡包时,往往会惊觉:几张大额微信立减金正静静“躺”在里面,而有效期却只剩寥寥数日。就像上海的张女士,上个月领取了一张500元立减金,本打算“下次购物再用”,结果忙起来就抛诸脑后,直…

(78页PPT)DG互联网+互联网+医疗在昆医附一院的应用(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/92565911 资料解读&#xff1a;互联网医疗在昆医附一院的应用 详细资料请看本解读文章的最后内容。昆明医科大学第一附属医院&#xff08;以…

解读金亿高举钻机公司介绍,优势亮点全知晓 - 工业品牌热点

2026年基建工程领域持续扩容,高效安全的护坡锚固设备已成为边坡防护、隧道加固等工程提升施工效率、降低安全风险的核心支撑。无论是高举钻机的高空作业适应性、履带底盘的复杂地形通过性,还是全液压系统的操作便捷性…

告别课程论文 “凑字数”!宏智树 AI:让学术小白轻松写出高分范文

每到学期末&#xff0c;课程论文就成了大学生的 “甜蜜负担”—— 想认真写却苦于选题无方向&#xff0c;想东拼西凑又怕查重超标&#xff0c;好不容易写完还被导师批 “逻辑混乱、缺乏学术性”。作为深耕论文写作科普的教育博主&#xff0c;今天就给大家安利一款课程论文写作神…