【问题标题】:android.os.NetworkOnMainThreadException exception while trying to call a webservice from my android java application?尝试从我的 android java 应用程序调用 web 服务时出现 android.os.NetworkOnMainThreadException 异常?
【发布时间】:2011-11-30 06:39:59
【问题描述】:

您好,我是 Android java 开发的新手,我正在尝试从我的 android java 应用程序调用 java webservice。当我试图运行这个应用程序时,我得到一个异常,上面写着 android.os.NetworkOnMainThreadException。我不知道为什么会出现这个错误..??无论如何,我被这个错误困住了。我已经用谷歌搜索了很多,但找不到确切的解决方案..任何人都可以帮忙..?我的代码如下。

        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 给了我一个空值。

【问题讨论】:

    标签: java android web-services


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可以使用 dot net Webservice 所以你添加 request .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;
      

      添加这条线后,您的请求成功......接受答案并支持

      【讨论】:

        【解决方案3】:

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

        来自link

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

        【讨论】:

          猜你喜欢
          • 2020-10-27
          • 2017-09-01
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 2018-02-02
          相关资源
          最近更新 更多