将自定义对象的ArrayList传递给kSOAP函数

时间:2011-11-01 01:24:11

标签: android ksoap

这是调用服务器中的函数执行某项任务的功能。但我必须传入一个ArrayList和一个String值。我无法将ArrayList传递给服务器。谁能告诉我应该怎么做?

public void findLocation(ArrayList<APData> apdatalist, String profilename){
    SoapObject request = new SoapObject(NAMESPACE, "FindLocation");

    PropertyInfo quotesProperty = new PropertyInfo();
    quotesProperty.setName("profileName");
    quotesProperty.setValue(profilename);
    quotesProperty.setType(String.class);
    request.addProperty(quotesProperty);

    request.addProperty("AP_List", APData.class);

    envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    HttpTransportSE httpRequest = new HttpTransportSE(URL);
    httpRequest.debug = true;
    String result = "";

    try
    {
        httpRequest.call(SOAP_ACTION, envelope);
        Log.e("Request",httpRequest.requestDump.toString());

        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
        Log.e("Response",httpRequest.responseDump.toString());

        result =  response.toString();
        if(result == null){
            Log.e("AndroidRuntime", "No location result is return!");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    //return temp;
}

1 个答案:

答案 0 :(得分:1)

我找到了一个可能的解决方案。我修改了SoapSerializationEnvelope类来处理ArrayList。 我修改了方法 public void writeObjectBody(XmlSerializer writer, KvmSerializable obj)

public void writeObjectBody(XmlSerializer writer, KvmSerializable obj) throws IOException
{
    // Added this code for parsing attributes of KvmSerializable objects

    int cnt = obj.getPropertyCount();
    PropertyInfo info = new PropertyInfo();
    for (int i = 0; i < cnt; i++)
    {
        Object prop = obj.getProperty(i);
        if(!(prop instanceof SoapObject)) {
            // prop is a PropertyInfo
            obj.getPropertyInfo(i, properties, info);

            // Added this code to parse ArrayList objects in requests
            if(prop instanceof ArrayList<?>){
                ArrayList<?> values = (ArrayList<?>)prop;
                for(Object o : values){
                    writer.startTag(info.namespace, info.name);
                    writeProperty(writer, o, info);
                    writer.endTag(info.namespace, info.name);
                }
            }else if ((info.flags & PropertyInfo.TRANSIENT) == 0)
            {
                writer.startTag(info.namespace, info.name);
                writeProperty(writer, obj.getProperty(i), info);
                writer.endTag(info.namespace, info.name);
            }
        } else {
            // prop is a SoapObject
            SoapObject nestedSoap = (SoapObject)prop;
            writer.startTag(nestedSoap.getNamespace(), nestedSoap.getName());
            writeObjectBody(writer, nestedSoap);
            writer.endTag(nestedSoap.getNamespace(), nestedSoap.getName());
        }
    }
}

这似乎对我有用