2011-12-30 57 views
0

我在android中编写了一个类,它将使用webservice从webservice读取一些数据。从android类调用webservice时出错

当通过URL调用访问该webservice时,我正确地获取了该响应xml。我已经在我的本地服务器上部署了webservice,我的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 

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

+1

你正在尝试在UI线程上执行HTTP。使用一个AsyncTask或其他一些构造,并从主线程中执行它,你会没事的。 – Jens 2011-12-30 09:26:42

回答

2

正如例外情况所示,您尝试从主(UI)线程使用网络(即可能较慢的阻塞资源)。 Android不会让你这么做 - 你应该在单独的线程上执行网络访问以保持UI的响应。

有关更多详细信息,请参阅"Designing for Responsiveness"指南。

+0

是的,Android不允许你在UI线程上执行网络操作,但从3.0开始。 – 2011-12-30 09:35:14

+0

我已经在onCreate方法中使用了这段代码。 – 2011-12-30 10:08:26

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

行添加到您的清单,以及。

希望这可以帮助