我在android中编写了一个类,它将使用web服务从web服务中读取一些数据。
通过URL调用访问该Web服务时,正确获取该响应xml。我已经在我的本地服务器中部署了web服务,并在我的URL中部署了类似http://localhost:8083/TestWebService/services/GetDatabaseRecords?wsdl的内容。
以下是用于在我的应用中使用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
我的代码有问题吗?专家请帮帮忙。
答案 0 :(得分:2)
正如异常所示,您正试图从主(UI)线程使用网络(即可能很慢的阻塞资源)。 Android不允许您这样做 - 您应该在单独的线程上执行网络访问以保持UI响应。
有关详细信息,请参阅"Designing for Responsiveness"指南。
答案 1 :(得分:0)
您必须在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
}
}
用法:
WebserviceTask task = new WebserviceTask();
task.execute("http://www.example.com/api"); //You can pass the parameters like this
别忘了添加
<uses-permission android:name="android.permission.INTERNET" />
也是你的清单。
希望这有帮助