Parcel.readException передает объект удаленной службе

Я написал удаленный сервис, который клиенты могут входить в систему с помощью обычных механизмов IPC, предоставляемых Android, и привязка, похоже, работает. Проблема возникает, когда я перехожу к вызову метода, в котором я должен передать объект в качестве параметра, потому что получаю это "любопытное" исключение:

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

Я тоже сталкивался с этой проблемой, и после того, как я немного пошутил, проблема возникла. Я собираюсь опубликовать свое решение, если это поможет другим найти дрейфующих в одной лодке.

Во-первых, отладка удаленного потока не работает в Eclipse, если вы не включили отладку в удаленной службе. Для этого мне нужно было запустить приложение и поставить точку останова в моем первом действии, которое просто связывает службу, после запуска и запуска службы. Я открываю окно DDMS в eclipse и выбираю удаленный поток и нажимаю кнопку отладки. Теперь можно вернуться в окно java и добавить точки останова в удаленную службу и запустить их.

Отныне я обнаружил, что проблема в том, что я пытался работать с объектом с нулевым указателем в моей функции заглушки в удаленном процессе, который, в свою очередь, вводил исключение пакета для исключения nullpointer в результате его возвращения и выглядел как то, вопрос спрашивает.

Мое решение было просто проверить, что объект был не равен null, прежде чем использовать его:)

то есть. Я добавил оператор "if", как вы ожидали бы в реализации функции заглушки...

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