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

时间:2011-11-30 06:40:00

标签: java android web-services

您是Android java开发的新手,我正在尝试从我的android java应用程序调用java webservice。当我试图运行这个应用程序时,我得到一个异常,说明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;正在出现问题。 代码envelope.bodyIn给我一个空值。

3 个答案:

答案 0 :(得分:2)

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

代码

 public void onClick(View v) {
    new DownloadImageTask().execute(data);
 }
 class Data {
      String namespace;
      String method;
 }

 private class DownloadImageTask extends AsyncTask<data, Void, SoapObject> {

 protected SoapObject doInBackground(Data... data) {
    //make your network call and return SoapObject
 }


protected void onPostExecute(SoapObject obj) {
    //process the Soap Object returned
}
}

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:0)

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

从此link

  

建议的方法是创建子线程并完成大部分操作   你的工作在那里。这保留了主线程(驱动用户   接口事件循环)运行并阻止系统结束   您的代码已冻结。因为这种线程通常是   在课堂上完成,您可以将响应能力视为一种   阶级问题。 (将此与基本性能进行比较,即   以上描述的方法级问题。)