从android类调用webservice时出错

时间:2011-12-30 09:24:56

标签: java android web-services android-emulator

我在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

我的代码有问题吗?专家请帮帮忙。

2 个答案:

答案 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" /> 

也是你的清单。

希望这有帮助