学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为1623字,预计阅读5分钟
前言
上一篇《Android Aidl跨进程通讯的简单使用》中介绍了跨进程的通讯处理,在进程间的数据通过Aidl实现了交互,项目中经常会遇到Bug,往往通过异常捕获来定位问题,所以这一篇我们就来看看跨进程之间的异常捕获。
实现效果
跨进程捕获异常实现
微卡智享
项目Demo还是用上一篇中的Demo,文中曾提到过创建AIDL文件和数据类后,需要ReBuild一下
在aidl中使用了数据类TestData,所以Aidl文件和数据类的文件必须保证在同一包名下,并不是说放在同一文件夹下,实体类TestData文件在主Code文件夹下(java目录下),包名和aidl文件夹中放置.aidl文件的包名一致。保证这样后再重新Rebuild就不会报错了。
Vaccae,公众号:微卡智享Android Aidl跨进程通讯的简单使用
通过Build生成的ITestDataAidlInterface JAVA类,如下图
然后在该类中可以看到定义的三个方法,后面都带有throws android.os.RemoteException的抛异常处理,那就用其中getTestData这个方案来进行抛异常的处理。
直接在Demo中的AidlService中修改这个方法的实现,如下图:
然后在Client端修改调用时捕获异常
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日志
日志中可以看到,有异常输出记录,Uncaught remote exception! (Exceptions are not yet supported across processes.),竟然写的是进程之间不支持异常。
那从ITestDataAidlInterface查看一下,可以看到reply中有writeException,那我们下一个源码看看Parcel中是怎么实现的
定位到Parcel中的writeException,在里面再找到getExceptionCode
在这里面看到的Exception中的类型,并没有RemoteException,看到这大概就明白了,那我们修改一下抛出异常的类型,改为上面第一个异常类型SecurityException
Client客户端异常捕获不用改,重新运行后,发现可以捕获到异常了。
结论
跨进程通讯中,从一端到另外一端,支持传递以下异常类型如下:
# | 跨进程传递异常类型 |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
完
往期精彩回顾
Android Aidl跨进程通讯的简单使用
Android BlueToothBLE入门(三)——数据的分包发送和接收(源码已更新)
Android BlueToothBLE入门(二)——设备的连接和通讯(附Demo源码地址)