尝试从我的android java应用程序调用web服务时android.os.NetworkOnMainThreadExceptionexception?

嗨,我是Android java开发的新手,我试图从我的android java应用程序调用java webservice。 当我试图运行此应用程序时,我得到一个exception,说明android.os.NetworkOnMainThreadException。 我不知道为什么会出现这个错误.. ?? 无论如何我都遇到了这个错误。 我已经google了很多,但无法找到一个确切的解决方案..任何人都可以帮助..?我的代码片段如下。

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION,envelope); SoapObject so = (SoapObject)envelope.bodyIn; 

完成调试后我认为这些代码行androidHttpTransport.call(SOAP_ACTION,envelope); SoapObject so = (SoapObject)envelope.bodyIn; androidHttpTransport.call(SOAP_ACTION,envelope); SoapObject so = (SoapObject)envelope.bodyIn; 正在制造问题。 代码envelope.bodyIn给我一个空值。

您可以使用AsyncTask,这将防止创建自己的线程的麻烦。 在doInBackGround方法中进行网络调用

  public void onClick(View v) { new DownloadImageTask().execute(data); } class Data { String namespace; String method; } private class DownloadImageTask extends AsyncTask { protected SoapObject doInBackground(Data... data) { //make your network call and return SoapObject } protected void onPostExecute(SoapObject obj) { //process the Soap Object returned } } 

您可以使用dot net Webservice,因此您可以在下面的行中添加请求.net true

 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); 

//在此处添加此行

  envelope.dotNet = true; 

//那你的代码

 envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

//添加此项以进行调试

 HttpTransportSE.debug = true; //this is optional, use it if you don't want to use a packet sniffer to check what the sent message was (httpTransport.requestDump) 

//作为你的代码

 androidHttpTransport.call(SOAP_ACTION,envelope); SoapObject so = (SoapObject)envelope.bodyIn; 

添加该行后,您的请求成功完成..接受答案并Upvote

您需要在另一个线程上启动网络请求。 该请求将阻止您的主线程,这将降低应用程序的响应能力。 请参阅exception文档 。 另一个链接告诉您标准方法。

从这个链接

建议的方法是创建一个子线程并在那里完成大部分工作。 这使主线程(驱动用户界面事件循环)保持运行,并阻止系统断定您的代码已冻结。 由于这种线程通常是在类级别完成的,因此您可以将响应性视为类问题。 (将其与基本性能进行比较,基本性能在上面被描述为方法级别的关注点。)