使用模拟器从Android使用WS

时间:2012-07-16 16:19:23

标签: android web-services android-emulator ksoap2

我正在尝试运行一个使用Web服务的Android应用程序的简单示例。在网络上的一些例子后,我终于这样做了:

private String getValueFromWS()
{
    try
    {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        String weight = "3700";
        String fromUnit = "Grams";
        String toUnit = "Kilograms";

        PropertyInfo weightProp =new PropertyInfo();
        weightProp.setName("Weight");
        weightProp.setValue(weight);
        weightProp.setType(double.class);
        request.addProperty(weightProp);

        PropertyInfo fromProp =new PropertyInfo();
        fromProp.setName("FromUnit");
        fromProp.setValue(fromUnit);
        fromProp.setType(String.class);
        request.addProperty(fromProp);

        PropertyInfo toProp =new PropertyInfo();
        toProp.setName("ToUnit");
        toProp.setValue(toUnit);
        toProp.setType(String.class);
        request.addProperty(toProp);

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

        androidHttpTransport.call(SOAP_ACTION, envelope);
        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

        return response.toString();
    }
    catch (Exception e)
    {
        return "Error: " + e.getMessage();
    }
}

我还添加了

<uses-permission android:name="android.permission.INTERNET"/>
清单文件中的

我不知道为什么它会在

处引发异常
androidHttpTransport.call(SOAP_ACTION, envelope);

当它与模拟器一起运行时。我正在使用2.5.8版本的kSoap,模拟器运行的是Android 4.1(16级)。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

对于迟到的回复,很抱歉,由于您正在主UI线程上执行网络调用,因此发生了异常。尝试在AsyncTask的doInBackground()方法中执行调用,以从主线程卸载调用。另一种解决此问题的方法是更改​​JellyBean(4.x)模拟器上默认启用的严格模式。您也可以在旧版本的sdk / emulator(2.3.x)上试用代码,以使其正常工作。

这解释了错误:

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html