Android AIDL通信DeadObjectException解决方法是什么
导读:本文共3040.5字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 崩溃来源首先,这个崩溃的意思是,多进程在进行跨进程Binder通信的时候,发现通信的Binder对端已经死亡了。抛出异常的Java堆栈最后一行是BinderProxy.transactNative,所以我们从这个方法入手,看看崩溃是在哪里产生的。很显现,transactNative对应的是一个native方法,我们找到对应的native方法,在android_u... ...
目录
(为您整理了一些要点),点击可以直达。首先,这个崩溃的意思是,多进程在进行跨进程Binder
通信的时候,发现通信的Binder
对端已经死亡了。
抛出异常的Java
堆栈最后一行是BinderProxy.transactNative
,所以我们从这个方法入手,看看崩溃是在哪里产生的。
很显现,transactNative
对应的是一个native
方法,我们找到对应的native
方法,在android_util_Binder.cpp
中。
可以看到,这个方法主要做的事情是:
将Java
层传入的data
,转换成C++
层的指针
获取C++
层的Binder
代理对象
调用BpBinder
对象的transact
方法
处理transact
的结果,抛出异常
接下来我们看看,BpBinder
的transact
方法。
transact
的具体方法,我们这里先不讨论。我们可以看到,在这里会判断当前的Binder
对象是否alive
,如果不alive
,会直接返回DEAD_OBJECT
的状态。
返回的结果,在android_util_Binder
的signalExceptionForError
中处理。
这个方法,其实包含非常多异常情况的处理。为了看起来更清晰,这里我们省略了其他异常的处理逻辑,只保留了DEAD_OBJECT
的处理。可以很明显的看到,在这里我们抛出了DeadObjectException
异常。
通过前面的源码分析,我们知道DeadObjectException
是发生在,当我们调用transact
接口发现Binder
对象不再存活的情况。
解决方案也很简单,就是当这个Binder
对象死亡之后,不再调用transact
接口。
这个方案比较简单粗暴,就是在多有调用跨进程接口的地方,都加一个Binder是否存活的判断。
我们来看下isBinderAlive
的源码,就是判断mAlive
标志位是否为0。
先初始化一个DeathRecipient
,用来监听死亡通知。
在这个死亡监听里,我们可以选择几种处理方式:
什么都不做,直接将mService
设置为空
再次尝试启动和绑定服务
在onServiceConnected
方法中,注册死亡监听:
Android AIDL通信DeadObjectException解决方法是什么的详细内容,希望对您有所帮助,信息来源于网络。