Parcel.readException将对象传递给远程服务

时间:2010-10-19 15:36:24

标签: android service parcelable

我编写了一个远程服务,客户端可以使用Android提供的IPC常用机制登录,绑定似乎有效。当我去调用一个必须将对象作为参数传递的方法时出现问题,因为我得到了这个“好奇”的异常:

10-19 15:09:04.601: ERROR/AndroidRuntime(2985): FATAL EXCEPTION: main  
10-19 15:09:04.601: ERROR/AndroidRuntime(2985): java.lang.NullPointerException  
10-19 15:09:04.601: ERROR/AndroidRuntime(2985): at android.os.Parcel.readException(Parcel.java:1253)   
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):at android.os.Parcel.readException(Parcel.java:1235)  
10-19 15:09:04.601: ERROR/AndroidRuntime(2985): at it.domod.commons.interfaces.DeviceManager$Stub$Proxy.sendCommand(DeviceManager.java:121)

似乎是从.aidl文件生成的代理类抛出的。

更奇怪的是,对象似乎正确传递但可能存在错误。有什么想法吗?

1 个答案:

答案 0 :(得分:11)

我也遇到过这个问题,经过一番探索后发现了这个问题。我将发布我的解决方案,以防其他人发现在同一条船上漂流。

首先调试远程线程在Eclipse中不起作用,除非您在远程服务上启用调试。要做到这一点,我需要运行应用程序并在我的第一个活动中设置一个断点,该活动只是绑定服务,一旦服务启动并运行我在eclipse中打开DDMS窗口并选择远程线程并按下调试按钮。现在可以跳回到java窗口并将断点添加到远程服务中并触发它们。

从那里我发现我的问题实际上是我试图在远程进程中的存根函数中对空指针对象进行操作,然后在返回的结果中为nullpointerexception注入了一个parcel异常,看起来像是这个原始的问题在于询问。

我的解决方案只是在使用它之前测试对象是否为空:)

即。我在实现存根函数时添加了'if'语句......

if( myobject != null )
{
   myobject.dosomething() 
}