2011-12-30 58 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" /> 

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

希望這可以幫助