Java 从android类调用webservice时出错
我用android编写了一个类,它将使用Web服务从Web服务读取一些数据 当我通过URL调用访问该Web服务时,我正确地得到了响应xml。我在本地服务器和url中部署了webservice 以下是我在我的应用程序中使用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
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" />