Сложные объекты с веб-сервисом SOAP: ClassCastException

Я получаю ArrayList сложных объектов с использованием библиотеки KSOAP2 на основе этого урока:

И я могу получить arrayList объектов. Проблема в том, что конверт имеет только один объект... Когда я делаю:

//...Call webservice
Vector<SoapObject> vectorOfSoapObject = (Vector<SoapObject>)envelope.getResponse();
//pass Vector to ArrayList

Это возвращает мне ClassCastException на этой линии, когда у меня есть только один объект на конверте. Когда у меня есть больше, это работает отлично (я сделал отладку, чтобы увидеть это происходит)...

В чем может быть проблема?

2 ответа

Решение

Я смог решить эту проблему. Используя предложение @Pranalee, я сделал это:

//call webservice
Object o1 = envelope.getResponse();
if(o1 == null){//no devices updated
    Log.d("GetUpdatesThread","o1==null");
} else if(o1.getClass().toString().equals(new SoapObject("", "").getClass().toString())){//one device updated
    Log.d("GetUpdatesThread","class -- soapObject");
    SoapObject result = (SoapObject) envelope.getResponse();
    Device d = convertToDevice(result);
    devicesUpdated.add(d);
} else if (o1.getClass().toString().equals(new Vector().getClass().toString())){//more than one device updated
    Log.d("GetUpdatesThread","class -- vector");
    Vector<SoapObject> vectorOfSoapObject2 = (Vector<SoapObject>)envelope.getResponse();
    for (SoapObject soapObject : vectorOfSoapObject2) {
         Device d = convertToDevice(soapObject);
         devicesUpdated.add(d);
    }  
}

Может случиться так, что когда существует более одной записи, сервис возвращает Vector<SoapObject> и когда есть только запись, она возвращает только SoapObject,
Вы пытаетесь разыграть SoapObject в Vector<SoapObject>, Итак ClassCastException,
Это проблема с внедрением сервиса. Однако, чтобы исправить это с вашей стороны, вы должны сначала получить envelope.getResponse() как Objectи проверьте, если Object это пример Vector<SoapObject> или же SoapObject до кастинга.

Vector<SoapObject> vectorOfSoapObject = null;
Object response = envelope.getResponse();

if( response instanceof Vector){
   Vector<SoapObject> vectorOfSoapObject = (Vector<SoapObject>) response;       
}else if(response instanceof  SoapObject){
    //cast single object
   SoapObject soapObject = (SoapObject) response;
   //initialize vector
   vectorOfSoapObject = new Vector<SoapObject>();
   //add single object to vector. 
   vectorOfSoapObject.add(soapObject);
}

Таким образом, вам не придется изменять другой код, который вы могли бы написать, предполагая, что вы всегда будете получать список

Другие вопросы по тегам