Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
1.RemoteCallbackList vs ArrayList
RemoteCallbackList 是一个特殊的 List,它用来管理跨进程的回调,特别是当回调对象是在不同进程中时。它在 AIDL(Android Interface Definition Language)通信中常常用来处理跨进程的通信。
ArrayList 是普通的 Java 集合类,它通常不适合在 AIDL 中使用,尤其是在进程间通信中。
RemoteCallbackList 的优势:
RemoteCallbackList 可以有效地管理跨进程通信中的回调对象,并且能够处理回调对象因进程崩溃(如 binder dead)而被移除的问题。
当一个客户端(比如进程 C)崩溃或与服务的连接断开时,RemoteCallbackList 会自动移除这个客户端的回调,避免了因为失效的回调导致后续客户端的通信被阻塞的问题。
ArrayList 的问题:
如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。
在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。
2. binder dead 问题
binder dead 是指 AIDL 连接的进程发生崩溃或者断开连接时,AIDL 的 Binder 机制无法再和该进程通信,导致调用失败。
如果多个进程(比如 A、B、C、D)通过 AIDL 连接同一个服务(比如服务 E),在默认情况下,如果某个进程(例如 C)发生了 binder dead,该进程将从回调列表中被移除。
如果使用的是普通的 ArrayList,则这个 binder dead 的事件可能不会及时被处理,导致后续的进程(如 D)也会受到阻塞。因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。
3. 具体的例子说明
假设有 4 个进程 A、B、C、D,且它们都通过 AIDL 连接到了同一个服务 E。
正常情况:服务 E 会为每个进程(A、B、C、D)注册回调。服务 E 可以向这些进程发送回调消息。
C 崩溃的情况:如果进程 C 崩溃(即发生 binder dead),那么如果使用的是 ArrayList 存储回调对象,服务 E 仍然会尝试通过 ArrayList 向 C 发送回调信息。这会导致一些问题,例如:
服务 E 会持续尝试与 C 通信,浪费资源。
后续的进程(如 D)可能会因为某种同步机制或等待 C 的回调而遭遇阻塞。
这就是为什么使用 ArrayList 在 AIDL 中会带来潜在问题,特别是在处理进程崩溃时。
使用 RemoteCallbackList:如果使用 RemoteCallbackList,当 C 进程崩溃时,RemoteCallbackList 会自动移除 C 的回调,避免了对 C 进程的无效通信。这样,服务 E 可以继续正常向 A、B、D 等其他进程发送回调信息,不会被 C 的崩溃所阻塞。
4. 总结
RemoteCallbackList 是专门为跨进程通信设计的,它能够有效地处理进程崩溃的情况,避免崩溃的进程阻塞其他进程的通信。
ArrayList 在 AIDL 中不适用于存储跨进程的回调,因为它无法自动移除已经失效的回调对象,可能导致 binder dead 事件后,其他进程的通信被阻塞。
在 AIDL 中使用 RemoteCallbackList 是一种更安全和高效的方式,尤其是当多个进程需要通过同一个服务进行通信时。
以上一句话概括:RemoteCallbackList 代替ArrayList
它经常使用于AIDL进程间通信,如果AIDL使用ArrayList,可能会导致binderdead 不能恢复
比如 ABCD 4个进程都通过AIDL连接了一个Service E,C如果binderdead了就会阻塞之后的D与E的通信
相关文章:
Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
1.RemoteCallbackList vs ArrayList RemoteCallbackList 是一个特殊的 List,它用来管理跨进程的回调,特别是当回调对象是在不同进程中时。它在 AIDL(Android Interface Definition Language)通信中常常用来处理跨进程的通信。 Arr…...
ADC(二):外部触发
有关ADC的基础知识请参考标准库入门教程 ADC(二):外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…...
数仓开发那些事(8)
程序员圣经 为什么刚刚能运行,现在就不行 为什么刚刚不运行,现在就可以 为什么他的可以跑,我的不能跑 为什么我的可以跑,他的就不行 为什么这台电脑能,那台就不行 为什么这台电脑不行,那台就行 神州员工&a…...
【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...
【连续学习之ResCL算法】2020年AAAI会议论文:Residual continual learning
1 介绍 年份:2020 会议: AAAI Lee J, Joo D, Hong H G, et al. Residual continual learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 4553-4560. 本文提出的算法是Residual Continual Learning (ResC…...
【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...
数据流图和流程图的区别
在结构化建模中,数据流图和流程图都是非常重要的工具,它们为开发人员提供了强大的手段来分析和设计系统。尽管两者在表面上看起来有些相似,但它们在功能、用途和表达方式上存在显著的区别。本文将详细探讨数据流图和流程图的区别,…...
关于内网服务器依托可上网电脑实现访问互联网
关于内网服务器依托可上网电脑实现访问互联网 背景:在实验室内网的一个服务器,没有配置 NAT ,无法使用外网,只能在局域网内进行访问,但是呢,我们自己的电脑是可以访问互联网的,那么怎么通过让自…...
期权懂|期权入门知识:如何选择期权合约?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权入门知识:如何选择期权合约? 一、选择月份: 通常情况下,月份的选择与期货合约的选择类似,主要关注主力合约。主力…...
如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码
如何用gpt来分析链接里面的内容,方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里:发现正确识别和分析了链接里面的内容 链接如下:https://arxiv.org/pdf/2009.1…...
Bash 脚本教程
注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…...
Pinia最简单使用(vite+vue3)
文章目录 创建项目安装Pinia包main.js注册Pinia在src下创建store/store.js文件,放入以下内容在app.vue中的使用(在其他组件也一样的) 创建项目 npm create vitelatest my-vue-app选vue 选JavaScript cd my-vue-app npm install npm run dev安装Pinia包 npm install piniamain…...
计算机网络——期末复习(4)协议或技术汇总、思维导图
思维导图 协议与技术 物理层通信协议:曼彻斯特编码链路层通信协议:CSMA/CD (1)停止-等待协议(属于自动请求重传ARQ协议):确认、否认、重传、超时重传、 (2)回退N帧协…...
Microsoft word@【标题样式】应用不生效(主要表现为在导航窗格不显示)
背景 随笔。Microsoft word 2013基础使用,仅做参考和积累。 问题 Microsoft word 2013,对段落标题文字应用【标题样式】不生效(主要表现为在导航窗格不显示)。 图1 图2 观察图1和图2,发现图1的文字在应用【标题一】样…...
轮播图带详情插件、uniApp插件
超级好用的轮播图 介绍访问地址参数介绍使用方法(简单使用,参数结构点击链接查看详情)图片展示 介绍 带有底部物品介绍以及价格的轮播图组件,持续维护,uniApp插件,直接下载填充数据就可以在项目里面使用 …...
云计算时代携程的网络架构变迁
大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案:OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…...
USB 状态机及状态转换
文章目录 USB 状态机及状态转换连接状态供电状态默认状态地址状态配置状态挂起状态USB 状态机及状态转换 枚举完成之前,USB 设备要经过一系列的状态变化,才能最终完成枚举。这些状态是 连接状态 - attached供电状态 - powered默认状态 - default地址状态 - address配置状态 -…...
Go C编程 第6课 无人机 --- 计算旋转角
旋转的秘密---认识角度 rt、lt命令学习 goc电子课程 一、编程步骤 第一步 第二步 第三步 第四步 二、画“四轴无人机” (一)、画第一根机轴 (二)、画第二根机轴 (三)、画完整的无人机 三、画“多轴无人…...
C++-----图
一、图的结构 在 C 中,图可以用多种结构表示,常见的有邻接矩阵和邻接表。 邻接矩阵 使用二维数组 adjMatrix 来表示图中顶点之间的连接关系。对于无向图,如果 adjMatrix[i][j] 不为零,则表示顶点 i 和顶点 j 之间存在边&#x…...
mysql 数据库迁移到达梦数据库
1.windows安装达梦数据库,去官网下载 dm8 进行安装,安装后,可以使用管理工具管理数据 使用迁移工具对数据进行迁移; 2.使用php 或者 thinkphp连接达梦数据库 2.1、先PHP开启DM扩展 从达梦数据库安装目录下drivers/php_pdo 复制对…...
2025届最火的六大AI学术助手解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 维普AIGC检测系统专门用来识别学术文本里由人工智能生成的内容,随着AI写作工具变…...
从滤波到故障诊断:手把手教你用MATLAB实现信号互相关分析的实际项目
从振动信号到故障定位:MATLAB互相关分析的工业实战指南 车间里那台大型离心泵的异常振动已经持续两周了。王工程师带着加速度传感器采集了三组不同位置的振动信号,屏幕上跳动的波形看起来杂乱无章。"到底是轴承磨损还是叶轮不平衡?"…...
如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300%
如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是…...
STEP3-VL-10B开源大模型部署:从HuggingFace下载到CSDN算力上线全过程
STEP3-VL-10B开源大模型部署:从HuggingFace下载到CSDN算力上线全过程 想体验一个能看懂图片、理解图表、甚至帮你分析复杂文档的AI助手吗?今天要介绍的STEP3-VL-10B,就是一个让你用普通显卡就能跑起来的“多面手”AI模型。 你可能听说过那些…...
GD32外部晶振配置不当引发串口乱码的时钟树深度解析与修复
1. 时钟树:微控制器的心跳发生器 第一次用GD32调串口的朋友,八成遇到过这样的场景:代码明明和官方例程一模一样,烧录后串口助手却疯狂输出乱码。这种时候千万别急着怀疑人生,问题的根源往往藏在那个不起眼的外部晶振配…...
FPGA调试:除了SignalTap,你更应该试试Quartus自带的这个免费“信号发生器+逻辑分析仪”
FPGA调试实战:Quartus自带的轻量级调试利器In-System Sources and Probes Editor 在FPGA开发中,调试环节往往占据项目周期的半壁江山。当SignalTap II这类逻辑分析仪因资源占用过高而显得"杀鸡用牛刀"时,许多工程师会陷入两难——既…...
突破限制:3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案
突破限制:3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/Media…...
MPU6050数据老飘?手把手教你用ESP32进行传感器校准与DMP库调优(附源码)
MPU6050数据漂移难题的终极解决方案:ESP32校准与DMP实战指南 当你的智能平衡车突然"抽风",或是无人机姿态数据像喝醉一样飘忽不定,问题很可能出在MPU6050这个看似简单却暗藏玄机的6轴传感器上。作为物联网和智能硬件开发中最常用的…...
21.【RTL_Synthesis】Analyzing Synthesis Results(综合结果分析)
🔍 分析综合结果:从数字到洞察 我们已经学会了用 Yosys 把 RTL 综合成门级网表,也知道了如何用脚本批量处理不同工艺角。但综合工具跑完之后,我们得到了一堆数字:多少门、多少触发器、面积多大……这些数字到底意味着什…...
Ostrakon-VL扫描终端实战案例:连锁快餐店菜单图像结构化解析
Ostrakon-VL扫描终端实战案例:连锁快餐店菜单图像结构化解析 1. 项目背景与价值 在连锁快餐行业,菜单更新是日常运营的重要环节。传统方式需要人工录入新品信息、核对价格变动,这个过程既耗时又容易出错。我们基于Ostrakon-VL-8B多模态大模…...
