ksoap2 - 相同的方法适用于 AsyncTask,但在正常 activity 内部使用时无效

ksoap2 - Same method works wih AsyncTask but no when using inside normal activity

我正在开发一个 APP,它具有可供用户以两种不同方式使用的功能:实时执行任务,因此 he/she 必须等到任务完成;或者在后台执行任务,这样 he/she 可以同时做其他事情。

我已经在后台使用 AsyncTask 开发了任务并且它可以工作,但是我不知道为什么当我尝试在普通 activity 中调用相同的方法时出现错误。

这是使用 ksoap2 的方法,我正在测试的参数值为“http://www.google.com

public String sendURL(String url) {
    Log.i("URL", url);
    //Create request
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("url", url);

    //Create envelope
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = false;
    envelope.implicitTypes = true;
    envelope.setAddAdornments(false);
    envelope.setOutputSoapObject(request);

    //Create HTTP call object
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    androidHttpTransport.debug = true;
    androidHttpTransport.setXmlVersionTag("<!--?xml version=\"1.0\" encoding= \"UTF-8\" ?-->");

    SoapPrimitive response = null;
    try {
        //Invoke web service
        androidHttpTransport.call(SOAP_ACTION, envelope);  // HERE is where I'm getting the error
        //Get the response
        response = (SoapPrimitive) envelope.getResponse();
        // Return the response
        return response.toString();
    } catch (SocketException e) {
        e.printStackTrace();
        // TODO Error, el servidor no esta levantado
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    return null;
}

这是我从 Android Studio 得到的输出错误:

03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err: java.net.MalformedURLException
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at java.net.URL.<init>(URL.java:152)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at java.net.URL.<init>(URL.java:125)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at org.ksoap2.transport.ServiceConnectionSE.<init>(ServiceConnectionSE.java:39)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at org.ksoap2.transport.HttpTransportSE.getServiceConnection(HttpTransportSE.java:104)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:61)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at es.sia.urlanalyzer.Analyze.sendURL(Analyze.java:377)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at es.sia.urlanalyzer.Analyze.onClick(Analyze.java:167)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at android.view.View.performClick(View.java:5198)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at android.view.View$PerformClick.run(View.java:21147)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
03-28 09:25:50.291 17894-17894/es.sia.urlanalyzer W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
03-28 09:25:50.292 17894-17894/es.sia.urlanalyzer W/System.err:     at android.os.Looper.loop(Looper.java:148)
03-28 09:25:50.292 17894-17894/es.sia.urlanalyzer W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
03-28 09:25:50.292 17894-17894/es.sia.urlanalyzer W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
03-28 09:25:50.292 17894-17894/es.sia.urlanalyzer W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-28 09:25:50.292 17894-17894/es.sia.urlanalyzer W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

相同的方法,完全相同,在扩展 AsyncTask 的自定义 class 中运行良好。对 Web 服务的 SOAP 调用的值为:

String NAMESPACE = "http://10.0.2.2:4894/AnalyzeURL_WS/services/";
String URL = "http://10.0.2.2:4894/AnalyzeURL_WS/services/AnalyzeURL";
String SOAP_ACTION = "http://10.0.2.2:4894/AnalyzeURL_WS/services/analyze";
String METHOD_NAME = "analyze";

原因很简单,ui您不能在主 thread/ui 线程上进行 运行 网络活动。网络活动应 运行 在后台服务上进行,以免干扰 U.i 进程,如果允许,则用户必须等待网络进程完成才能继续使用应用程序。这将是一个不好的做法,例如,如果我想上传大量从用户消息框获取的数据,并且我有 1000 条消息,如果在 ui 线程上允许此过程,则会花费太多时间,但是当您 运行 在后台上传服务时,用户可以在上传数据的同时舒适地使用应用程序的其他功能。因此网络活动被限制在主线程中发生,如果你这样做你会得到一个网络相关的异常。