1

我正在尝试运行一个使用 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 级)。

我做错了什么?

4

1 回答 1

2

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

这解释了错误:

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

于 2012-07-26T15:38:10.890 回答