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

Android Aidl跨进程通讯(二)--异常捕获处理

学更好的别人,

做更好的自己。

——《微卡智享》

b05f933ce04b28ec3c563c5f6adc2eea.jpeg

本文长度为1623,预计阅读5分钟

前言

上一篇《Android Aidl跨进程通讯的简单使用》中介绍了跨进程的通讯处理,在进程间的数据通过Aidl实现了交互,项目中经常会遇到Bug,往往通过异常捕获来定位问题,所以这一篇我们就来看看跨进程之间的异常捕获。

53e11fca21890b22cdf0f9aab6add7fd.png

实现效果

521316c4ff2cb3ae4906e786567de5c5.gif

62c008463679b297cceaed9f193e809c.jpeg

跨进程捕获异常实现

a7c1fb742781c66a2c74806c42ed5b04.png

微卡智享

项目Demo还是用上一篇中的Demo,文中曾提到过创建AIDL文件和数据类后,需要ReBuild一下

在aidl中使用了数据类TestData,所以Aidl文件和数据类的文件必须保证在同一包名下,并不是说放在同一文件夹下,实体类TestData文件在主Code文件夹下(java目录下),包名和aidl文件夹中放置.aidl文件的包名一致。保证这样后再重新Rebuild就不会报错了。

Vaccae,公众号:微卡智享Android Aidl跨进程通讯的简单使用

通过Build生成的ITestDataAidlInterface JAVA类,如下图

16928330c49fd45eaa183eb7caf2ce27.png

98cd48d1490f8db80ecc5e414dc1fcd6.png

然后在该类中可以看到定义的三个方法,后面都带有throws android.os.RemoteException的抛异常处理,那就用其中getTestData这个方案来进行抛异常的处理。

直接在Demo中的AidlService中修改这个方法的实现,如下图:

c2774c0908289b755de5e39864ba7a96.png

然后在Client端修改调用时捕获异常

44c6fbed2905c864060bd77f22608873.png

binding.btngetdata.setOnClickListener { view ->try {AidlProcessUtil.getAidlService()?.getTestData("00001")?.let { p ->val msg = "编码${p.code} 名称:${p.name} 价格:${p.price} 数量:${p.qty}"Snackbar.make(view, msg, Snackbar.LENGTH_LONG).setAction("Action", null).show()}} catch (e: Exception) {Snackbar.make(view, e.message.toString(), Snackbar.LENGTH_LONG).show()}}

运行程序后发现点击按钮并没有Snake的弹窗提醒,程序也没有崩溃,那就来看看Log日志

72a5ca6e632abb970652cc6b7ce039e4.png

日志中可以看到,有异常输出记录,Uncaught remote exception!  (Exceptions are not yet supported across processes.),竟然写的是进程之间不支持异常。

那从ITestDataAidlInterface查看一下,可以看到reply中有writeException,那我们下一个源码看看Parcel中是怎么实现的

f6756908333dd5675d178d7b26168abb.png

定位到Parcel中的writeException,在里面再找到getExceptionCode

29a5c60d541058306d08a67feda76aaa.png

8d27bd8834cd2e402b4a7150a1f7aef8.png

在这里面看到的Exception中的类型,并没有RemoteException,看到这大概就明白了,那我们修改一下抛出异常的类型,改为上面第一个异常类型SecurityException

a0fbeb0e22d4ef4dee05c36ee32527aa.png

Client客户端异常捕获不用改,重新运行后,发现可以捕获到异常了。

结论

跨进程通讯中,从一端到另外一端,支持传递以下异常类型如下:

#跨进程传递异常类型
1
SecurityException
2
BadParcelableException
3
IllegalArgumentException
4
NullPointerException
5
IllegalStateExceptio‍
6
NetworkOnMainThreadExceptio
7
UnsupportedOperationException
8
ServiceSpecificException

63d7cf091ad24b06db60f6e696e9d7ec.png

21237d698d8f56532f6d5dac908820a8.png

往期精彩回顾

 

73b1727be0547325e77a872a1f6f2be7.jpeg

Android Aidl跨进程通讯的简单使用

 

 

c310dbb24cb4fd7690216183b810619f.jpeg

Android BlueToothBLE入门(三)——数据的分包发送和接收(源码已更新)

 

 

155ce3faef2c636d4920fa1952aa5aff.jpeg

Android BlueToothBLE入门(二)——设备的连接和通讯(附Demo源码地址)

 

 

相关文章:

Android Aidl跨进程通讯(二)--异常捕获处理

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为1623字,预计阅读5分钟 前言 上一篇《Android Aidl跨进程通讯的简单使用》中介绍了跨进程的通讯处理,在进程间的数据通过Aidl实现了交互,项目中经常会遇到Bug&#xff0c…...

Android中OkHttp源码阅读二(责任链模式)

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 Android OkHttp源码阅读详解一 看OkHttp源码,发现OkHttp里面使用了责任链设计模式,所以才要学习…...

2023年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:波兰表达式 波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解…...

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 😊 代码仓库分享 💕 前言: 今天我们来回顾一下顺序表与链表,针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习,这样才能巩固我们学习的内容。 话不多说&#xf…...

flex:1

问题1:“flex: 1” 与其他 “flex” 值有何区别? 答案: “flex: 1” 是 “flex” 属性的一种简写形式,它将 “flex-grow”、“flex-shrink” 和 “flex-basis” 设置为特定的值。与其他 “flex” 值相比,“flex: 1” …...

iOS练手项目知识点汇总

基础理解篇 Objective-C是一种面向对象的编程语言,它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中,元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…...

【Linux】Libevent相关小知识总结

Libevent是基于事件的,也就是说,相当于去注册一个事件,当这个事件发生的话,那么就会调用回调函数。...

【Spring Security】UserDetailsService 接口介绍

文章目录 UserDetailsService 介绍UserDetailsService 具体操作UserDetailsService 方法介绍 UserDetailsService 介绍 UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。大白话就是你写一个实现类实现 UserDetailsServic…...

Mybatis学习|日志工厂、分页

1.日志工厂 如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手! 曾经: sout、debug 现在:日志工厂! 我们主要掌握STDOUT_LOGGING 和LOG4j 在Mybatis中具体使用哪个一日志实现,在设置中设定! 在mybatis核心配置文件中&#…...

Vivado 添加FPGA开发板的Boards file的添加

1 digilent board file 下载地址 下载地址 : https://github.com/Digilent/vivado-boards 2 下载后 3 添加文件到 vivado 安装路径 把文件复制到 Vivado\2019.1\data\boards\board_files4 创建工程查看是否安装成功...

vmstat

vmstat VirtualMeomoryStatistics,虚拟内存统计,是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。 [rootwenzi wenzi]# vmstat procs -----------memory---------- ---swap-- -----io---- -system--…...

LinuxShell变量

变量: 命名规则: 在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是…...

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了,全程只需要一部手机,就能完成24小时直播带货,不需要真人出镜,不需要场地,不需要搭建直播间,只需要一部手机就可以了。真人语音讲解,真人智能回复,实…...

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示? 从上面图片可以看到,Item为红色,数字5为黑色。 要实现在一个控件实现不同颜色,目前想到的只有QTextEdit 、QLabel。有两种方法,第一种是代理,第二种是…...

Aspose导出word使用记录

背景:Aspose系列的控件,功能实现都比较强大,可以实现多样化的报表设计及输出。 通过这次业务机会,锂宝碳审核中业务功需要实现Word文档表格的动态导出功能,因此学习了相关内容,在学习和参考了官方API文档的…...

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景 文件的写入目前没有发现可以增量写入的,只能是完全重新写入。对于大量数据需要写入XML文件,还是和读XML文件一样,不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里,也是有相关的SAX类来写入数据流&#xf…...

java里面封装https请求工具类

1.工具类如下 Component Slf4j public class RestClientUtil<T> {private final RestTemplate restTemplate;public RestClientUtil() {this.restTemplate new RestTemplate();}public JSONObject uploadFile(String url, String fileUrl) throws IOException {List<…...

uniApp常见面试题-附详细答案

uniApp中如何进行页面跳转&#xff1f; 答案&#xff1a;可以使用uni.navigateTo、uni.redirectTo和uni.reLaunch等方法进行页面跳转。其中&#xff0c;uni.navigateTo可以实现页面的普通跳转&#xff0c;uni.redirectTo可以实现页面的重定向跳转&#xff0c;uni.reLaunch可以实…...

Java“牵手”1688整店商品API接口数据,通过店铺ID获取整店商品详情数据,1688店铺所有商品API申请指南

1688平台店铺所有商品数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...

数据进制的转换

其他进制转换为十进制 通过按权展开法转换 十进制转换为其他进制 通过短除法转换&#xff08;注意计算结果是倒着的&#xff09; 例如将十进制的94转换为二进制 二进制转八进制和十六进制 3位二进制数表示1位八进制数&#xff0c;4位二进制数表示1位十六进制数 同理八进制数…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...