0

このチュートリアルに基づいて、KSOAP2 ライブラリを使用して複雑なオブジェクトの ArrayList を取得しています。

そして、オブジェクトのarrayListを受け取ることができます。問題は、エンベロープにオブジェクトが1つしかない場合です...私がそうするとき:

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

ClassCastExceptionエンベロープにオブジェクトが 1 つしかない場合、この行にが返されます。より多くの場合、正常に動作します(これが起こっていることを確認するためにデバッグを行いました)...

何が問題なのですか?

4

2 に答える 2

1

私はこの問題を解決することができました。@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);
    }  
}
于 2012-06-04T11:38:33.467 に答える
1

複数のレコードがある場合はサービスが返さVector<SoapObject>れ、レコードしかない場合は のみが返される場合がありますSoapObject
にキャストしようとしているSoapObjectのでVector<SoapObject>ClassCastException.
これは、サービスの実装に関する問題です。ただし、最後にこれを修正するには、最初にenvelope.getResponse()asを取得し、キャストする前にのインスタンスかObjectどうかを確認する必要があります。ObjectVector<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);
}

このようにして、常にリストを取得するという仮定の下で記述した可能性のある他のコードを変更する必要はありません

于 2012-06-01T18:16:05.960 に答える