Java 从android类调用webservice时出错

Java 从android类调用webservice时出错,java,android,web-services,android-emulator,Java,Android,Web Services,Android Emulator,我用android编写了一个类,它将使用Web服务从Web服务读取一些数据 当我通过URL调用访问该Web服务时,我正确地得到了响应xml。我在本地服务器和url中部署了webservice 以下是我在我的应用程序中使用webservice的代码部分 private String METHOD_NAME = "getSupplierDetails"; // our webservice method name private String NAMESPACE = "http://test.web

我用android编写了一个类,它将使用Web服务从Web服务读取一些数据

当我通过URL调用访问该Web服务时,我正确地得到了响应xml。我在本地服务器和url中部署了webservice

以下是我在我的应用程序中使用webservice的代码部分

private String METHOD_NAME = "getSupplierDetails"; // our webservice method name
private String NAMESPACE = "http://test.webservice.com/"; // Here package name in webservice with reverse order.
private String SOAP_ACTION = NAMESPACE + METHOD_NAME; // NAMESPACE + method name
private static final String URL = "http://my-machine-ip:8083/TestWebService/services/GetDatabaseRecords?wsdl";

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;
        androidHttpTransport.call(SOAP_ACTION,envelope);
        SoapObject so = (SoapObject)envelope.bodyIn;
以下是我在运行应用程序时遇到的异常

android.os.NetworkOnMainThreadException:null

我的代码有问题吗?请专家提供帮助。

如例外情况所示,您正试图从主(UI)线程使用网络(即可能速度较慢、阻塞的资源)。Android不允许您这样做——您应该在单独的线程上执行网络访问,以保持UI的响应性


有关更多详细信息,请参阅指南。

对于Android中的此类任务,您必须使用后台线程。坦率地说,Android提供了AsyncTask类型,这正是您想要做的。比如:

private class WebserviceTask extends AsyncTask<String, Void, Object> {
 protected void doInBackground(String... parameters) {
     //do web service things here
     return result; //This is the parameter of onPostExecute, change type accordingly
 }

 protected void onPostExecute(Object result) {
     //do something with the result
 }
}
别忘了添加

<uses-permission android:name="android.permission.INTERNET" /> 

你的舱单上也有一行


希望这对您尝试在UI线程上执行HTTP有所帮助。使用AsyncTask或其他构造,并在主线程下执行,您会没事的。是的,Android不允许您在UI线程上执行网络操作,但仅从3.0开始。
<uses-permission android:name="android.permission.INTERNET" />