Сложни обекти със SOAP уеб услуга: ClassCastException

Получавам ArrayList от сложни обекти, използвайки библиотека KSOAP2 въз основа на това урок:

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

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

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

Какъв може да е проблема?


person amp    schedule 01.06.2012    source източник


Отговори (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);
    }  
}
person amp    schedule 04.06.2012
comment
Персонализиран метод ли е convertToDevice, който сте написали за анализиране на SoapObject към и запълване на Device? - person capdragon; 29.12.2012

Може да се окаже, че когато има повече от един запис, услугата връща 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);
}

по този начин няма да се налага да променяте друг код, който може да сте написали при предположението, че винаги ще получавате списък

person Pranalee    schedule 01.06.2012
comment
здрасти И как мога да проверя дали е екземпляр на Vector<SoapObject> или SoapObject? - person amp; 01.06.2012
comment
използвайки екземпляр на оператор. Имате актуализиран отговор с кодов фрагмент - person Pranalee; 05.06.2012