【问题标题】:NetworkOnMainThreadException on doing a soap request [duplicate]NetworkOnMainThreadException 做一个肥皂请求[重复]
【发布时间】:2014-04-23 09:11:37
【问题描述】:

我正在尝试根据这个 WSDL 方案做一个肥皂请求:

http://pastebin.com/UT3t5XdQ

这是我的应用代码:

private final String SOAP_ACTION = "https://t4t.services.telenet.be/TelemeterService";
    private final String NAMESPACE = "http://www.telenet.be/TelemeterService/";
    private final String METHOD_NAME = "RetrieveUsageRequestType";
    private final String URL = "https://t4t.services.telenet.be/TelemeterService.wsdl";

    private Button sendButton;
    private TextView responseView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendButton = (Button) findViewById(R.id.send);
        responseView = (TextView) findViewById(R.id.response);

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                //Parameters
                request.addProperty("UserId","test@telenet.be");
                request.addProperty("Password","test");

                //Version Soap
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                envelope.setOutputSoapObject(request);
                envelope.dotNet = true;

                try {
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                    //Call the webservice
                    androidHttpTransport.call(SOAP_ACTION, envelope);

                    // Get the result
                    SoapObject result = (SoapObject)envelope.bodyIn;

                    if(result != null)
                    {
                        Log.d("Debug","Result");
                        responseView.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

在我的清单中,我添加了互联网权限。

我遇到了这个异常:

04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ android.os.NetworkOnMainThreadException
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:254)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:126)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:185)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at test.example.com.MainActivity$1.onClick(MainActivity.java:54)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.view.View.performClick(View.java:4438)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.view.View$PerformClick.run(View.java:18422)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5017)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

标签: android soap android-ksoap2


【解决方案1】:

当应用程序尝试在其主线程上执行网络操作时会引发此异常。在AsyncTask 中运行您的代码:

private class SetTreasureBoxAsyncTask extends AsyncTask<String, String, String>
            {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }
                @Override
                protected String doInBackground(String... params) {

                     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                    //Parameters
                    request.addProperty("UserId","test@telenet.be");
                    request.addProperty("Password","test");

                    //Version Soap
                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                    envelope.setOutputSoapObject(request);
                    envelope.dotNet = true;

                    try {
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                        //Call the webservice
                        androidHttpTransport.call(SOAP_ACTION, envelope);

                        // Get the result
                        SoapObject result = (SoapObject)envelope.bodyIn;


                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return result.toString() ;
                }

                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);                
                     if(result != null)
                    {
                        Log.d("Debug","Result");
                        responseView.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                    }
                }

            }

在按钮单击中执行AsyncTask,如下所示,

sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
  new SetTreasureBoxAsyncTask().execute(); 
});

【讨论】:

    【解决方案2】:

    创建 Async 类并将你的肥皂请求代码放在 doinbackground() 方法中。 并在按钮点击事件上执行你的异步类。

    【讨论】:

      【解决方案3】:

      您可以从主线程访问网络功能。你需要启动一个外线程。

      sendButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
      
              new Thread(){
      
                  @Override
                      public void run() {
      
                  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
      
                  //Parameters
                  request.addProperty("UserId","test@telenet.be");
                  request.addProperty("Password","test");
      
                  //Version Soap
                  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
      
                  envelope.setOutputSoapObject(request);
                  envelope.dotNet = true;
      
                  try {
                      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
      
                      //Call the webservice
                      androidHttpTransport.call(SOAP_ACTION, envelope);
      
                      // Get the result
                      SoapObject result = (SoapObject)envelope.bodyIn;
      
                      if(result != null)
                      {
                          Log.d("Debug","Result");
                          responseView.setText(result.getProperty(0).toString());
                      }
                      else
                      {
                          Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
      
              }}.start();
          });
      

      您也可以使用 AsyncTask。

      【讨论】:

        【解决方案4】:

        您不得在主线程上执行(可能)长时间运行的进程。所有网络操作必须在单独的后台线程中运行,否则它们会冻结 UI。这通常会使您的应用崩溃,因为它在 UI 冻结时没有响应。

        查看Processes and Threads。你会发现AsyncTask在各种场合都非常好用。

        【讨论】:

          【解决方案5】:

          试试这个..

          class SoapConnection extends AsyncTask<String, Void, String> {
          
              protected String doInBackground(String... urls) {
                  String values = "";
                  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
          
                      //Parameters
                      request.addProperty("UserId","test@telenet.be");
                      request.addProperty("Password","test");
          
                      //Version Soap
                      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          
                      envelope.setOutputSoapObject(request);
                      envelope.dotNet = true;
          
                      try {
                          HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
          
                          //Call the webservice
                          androidHttpTransport.call(SOAP_ACTION, envelope);
          
                          // Get the result
                          SoapObject result = (SoapObject)envelope.bodyIn;
          
                          if(result != null)
                          {
                              values = result.getProperty(0).toString();
                          }
                          else
                          {
                              values = "No Response";
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
              }
          
              protected void onPostExecute(String result) {
                      if(result.equlas("No Response"))
                            Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                      else
                            responseView.setText(result);
              }
          }
          

          这样称呼

          sendButton.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {
                                 new SoapConnection().execute();
                      }
          });
          

          【讨论】:

            【解决方案6】:

            我解决了像 Spring Breaker 建议的问题。

            private Button sendButton;
            private TextView responseView;
            
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                sendButton = (Button) findViewById(R.id.send);
                responseView = (TextView) findViewById(R.id.response);
            
                sendButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        new SetTreasureBoxAsyncTask().execute();
                    }
            
                });
            }
            private class SetTreasureBoxAsyncTask extends AsyncTask<String, String, String>
            {
                SoapObject result = null;
            
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }
                @Override
                protected String doInBackground(String... params) {
            
            
            
                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            
                    //Parameters
                    request.addProperty("UserId","test@telenet.be");
                    request.addProperty("Password","test");
            
                    //Version Soap
                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            
                    envelope.setOutputSoapObject(request);
                    envelope.dotNet = true;
            
                    try {
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            
                        //Call the webservice
                        androidHttpTransport.call(SOAP_ACTION, envelope);
            
                        // Get the result
                        result = (SoapObject)envelope.bodyIn;
            
            
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            
                    if(result != null)
                        return result.toString();
                    else
                        return null;
                }
            
                @Override
                protected void onPostExecute(String res) {
                    super.onPostExecute(res);
                    if(result != null)
                    {
                        Log.d("Debug", "Result");
                        responseView.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                    }
                }
            
            }
            

            问题是任务花费了很长时间。

            【讨论】:

              猜你喜欢
              • 2011-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多