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

学更好的别人,

做更好的自己。

——《微卡智享》

Android Aidl跨进程通讯(二)--异常捕获处理_第1张图片

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

前言

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

53e11fca21890b22cdf0f9aab6add7fd.png

实现效果

Android Aidl跨进程通讯(二)--异常捕获处理_第2张图片

跨进程捕获异常实现

a7c1fb742781c66a2c74806c42ed5b04.png

微卡智享

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

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

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

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

Android Aidl跨进程通讯(二)--异常捕获处理_第3张图片

Android Aidl跨进程通讯(二)--异常捕获处理_第4张图片

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

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

Android Aidl跨进程通讯(二)--异常捕获处理_第5张图片

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

Android Aidl跨进程通讯(二)--异常捕获处理_第6张图片

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日志

Android Aidl跨进程通讯(二)--异常捕获处理_第7张图片

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

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

Android Aidl跨进程通讯(二)--异常捕获处理_第8张图片

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

Android Aidl跨进程通讯(二)--异常捕获处理_第9张图片

Android Aidl跨进程通讯(二)--异常捕获处理_第10张图片

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

Android Aidl跨进程通讯(二)--异常捕获处理_第11张图片

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

结论

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

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

63d7cf091ad24b06db60f6e696e9d7ec.png

21237d698d8f56532f6d5dac908820a8.png

往期精彩回顾

 

Android Aidl跨进程通讯(二)--异常捕获处理_第12张图片

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

 

 

Android Aidl跨进程通讯(二)--异常捕获处理_第13张图片

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

 

 

Android Aidl跨进程通讯(二)--异常捕获处理_第14张图片

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

 

 

你可能感兴趣的:(android)