学更好的别人,
做更好的自己。
——《微卡智享》

本文长度为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源码地址)



















