Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-如何使用ksoap向服务传递双值_Android_Web Services_Ksoap - Fatal编程技术网

android-如何使用ksoap向服务传递双值

android-如何使用ksoap向服务传递双值,android,web-services,ksoap,Android,Web Services,Ksoap,在我的应用程序中,我想使用ksoap将双值传递给web服务,但我得到的是NPE。在代码中,“出口距离”是双值。任何人都能找到其中的错误并发送示例吗 此处编码 //valus required for test RB_Constant.RB_Webservice_URL = ? RB_Constant.RB_Webservice_Namespace = ? public String getExitsRestaurants() throws SoapFault {

在我的应用程序中,我想使用
ksoap
双值
传递给
web服务
,但我得到的是
NPE
。在代码中,“出口距离”是双值。任何人都能找到其中的错误并发送示例吗

此处编码

//valus required for test 
RB_Constant.RB_Webservice_URL = ?
RB_Constant.RB_Webservice_Namespace = ?

public String getExitsRestaurants() throws SoapFault   
{           
    String data = "";
    String serviceUrl = RB_Constant.RB_Webservice_URL;
    String serviceNamespace = RB_Constant.RB_Webservice_Namespace; 
    String soapAction = "http://www.roadbrake.com/GetExitDetailsExtn";
    String type_of_soap = "GetExitDetailsExtn";      

    try
    {
        SoapObject Request = new SoapObject(serviceNamespace, type_of_soap);

        PropertyInfo HighwayIdObj = new PropertyInfo ();
        HighwayIdObj.name = "HighwayId";
        HighwayIdObj.type = PropertyInfo.INTEGER_CLASS;

        Request.addProperty("ExitNo", 7);
        Request.addProperty(HighwayIdObj, highwayid);   
        Request.addProperty("HighwayName", 95); 
        Request.addProperty("exit_distance", 1.2);                      


        System.out.println("Request Value->"+Request.toString());

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

        MarshalDouble md = new MarshalDouble();
        md.register(envelope);

        envelope.setOutputSoapObject(Request);

        try
        {
            HttpTransportSE androidHttpTransport = new HttpTransportSE(serviceUrl);
            androidHttpTransport.call(soapAction, envelope);
        }
        catch(Exception e)
        {
            System.out.println("Webservice calling error ->"+e.toString());
        }

        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
        data = response.toString();
        System.out.println("web service response->"+response.toString());   
    }
    catch(Exception e)
    {
        System.out.println("Soap Method Error ->"+e.toString());    
    }        
    return data;
}   

public class MarshalDouble implements Marshal 
{

    @Override
    public Object readInstance(XmlPullParser parser, String namespace, String name, 
            PropertyInfo expected) throws IOException, XmlPullParserException {

        return Double.parseDouble(parser.nextText());
    }


    public void register(SoapSerializationEnvelope cm) {
         cm.addMapping(cm.xsd, exit_distance, Double.class, this);

    }

    @Override
    public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
           writer.text(obj.toString());
        }           
}

带有NPE的堆栈跟踪应该给出它发生的行号。只要在那里设置一个调试断点,然后自己看看什么是空的。

最后我解决了这个问题。问题出在MarshalDouble类的register()方法中。下面是这个问题的解决方案

public void register(SoapSerializationEnvelope cm)  {
  cm.addMapping(cm.xsd, "double", Double.class, this);          
}

确切地说,像这样使用它

元帅班

import org.ksoap2.serialization.Marshal;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import java.io.IOException;


public class MarshalDouble implements Marshal {
    public Object readInstance(XmlPullParser parser, String namespace, String name,
                               PropertyInfo expected) throws IOException, XmlPullParserException {

        return Double.parseDouble(parser.nextText());
    }


    public void register(SoapSerializationEnvelope cm) {
        cm.addMapping(cm.xsd, "double", Double.class, this);

    }


    public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
        writer.text(obj.toString());
    }
}
实施

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

**MarshalDouble md = new MarshalDouble();
md.register(envelope);**

您可以简单地将propertyInfo的类型设置为Double.class

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);
    PropertyInfo pi=new PropertyInfo();

    pi.setName("name");
    pi.setValue(a);
    pi.setType(a.getClass());
    request.addProperty(pi);

    pi=new PropertyInfo();
    pi.setName("latitude");
    pi.setValue(b);
    pi.setType(Double.class);
    request.addProperty(pi);

    pi=new PropertyInfo();
    pi.setName("longitude");
    pi.setValue(c);
    pi.setType(Double.class);

    request.addProperty(pi);

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