2017-03-28 5 views
0

Je développe un APP et il a une fonctionalité qui peut être utilisé par l'utilisateur de deux façons différentes: faire le travail en temps réel, alors il/elle doit attendre que la tâche se termine; ou faire la tâche en arrière-plan afin qu'il/elle puisse faire d'autres choses en attendant.ksoap2 - Même méthode fonctionne wih AsyncTask mais pas lors de l'utilisation à l'intérieur de l'activité normale

J'ai développé la tâche en arrière-plan avec AsyncTask et cela fonctionne, mais je ne sais pas pourquoi je reçois et erreur quand j'essaie d'appeler la même méthode dans une activité normale.

Ceci est la méthode qui utilise ksoap2, la valeur du param je teste avec est « 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; 
} 

C'est l'erreur de sortie que je reçois d'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$1.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) 

la même méthode, exactement la même chose, fonctionne très bien dans une classe personnalisée qui étend AsyncTask. Les valeurs des appels SOAP au service Web sont:

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"; 
+0

Je pense que votre problème est AsyncTask pas KSOP –

+0

si vous me dites l'organigramme de votre programme je peux aider you.When fonctionne et async ainsi de suite. –

Répondre

0

La raison de cela est assez simple, vous ne pouvez pas exécuter les activités de réseau sur le thread principal fil/ui. Les activités réseau doivent être exécutées sur un service en arrière-plan afin de ne pas interférer avec les processus U.i, si cela était autorisé, un utilisateur devra attendre que le processus réseau soit terminé avant de continuer à utiliser l'application. Ce serait une mauvaise pratique, par exemple si je veux télécharger beaucoup de données que je récupère de la boîte de message des utilisateurs, et j'ai 1000 messages, si ce processus est autorisé sur ui thread, cela prendrait trop de temps, mais quand vous exécuter le service de téléchargement en arrière-plan, l'utilisateur peut utiliser confortablement d'autres fonctionnalités de l'application pendant que les données sont mises en œuvre. Par conséquent, les activités réseau ne peuvent pas se dérouler dans le thread principal, si vous le faites, vous obtenez une exception de relation réseau.

+0

Merci, je vais changer si les connexions Internet sont faites dans AsyncTask et l'un d'entre eux qui peut être annulée en cliquant sur un bouton sur l'interface, qui ne peut être fait si l'activité me avait laissé mener des activités de réseau sur la principale fil. Donc tu as résolu mon problème et me fais réaliser de l'autre, merci encore. –