0

Je suis nouveau sur les webservices SOAP et sur AsyncTask, je développe une application qui utilise les services web SOAP pour la connexion. J'ai essayé de faire tout le travail dans la méthode onCreate mais j'ai obtenu android.os.NetworkOnMainThreadException.Webservices AsyncTask et SOAP

J'ai donc essayé d'utiliser AsyncTask, mais je ne suis pas en mesure d'obtenir une référence à emailText et passwordText dans la classe RetrieveFeedTask.

Voici mon code:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 


    private static String SOAP_ACTION = "intentionally hided"; 
    private static String NAMESPACE = "intentionally hided"; 
    private static String METHOD_NAME = "intentionally hided"; 
    private static String URL = "intentionally hided"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     final EditText emailText = (EditText) findViewById(R.id.emailText); 
     final EditText passwordText = (EditText) findViewById(R.id.passwordText); 
     Button loginButton = (Button) findViewById(R.id.button_login); 

     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       new RetrieveFeedTask().execute(); 

      } 
     }); 
    } 

    class RetrieveFeedTask extends AsyncTask<String, String, String> { 



     protected String doInBackground(String... urls) { 


      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

      request.addProperty("userName", emailText.getText().toString()); 
      request.addProperty("userPassword", passwordText.getText().toString()); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

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

      try { 
       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

       androidHttpTransport.call(SOAP_ACTION, envelope); 

       SoapObject result = (SoapObject) envelope.bodyIn; 
       if (result != null) { 
        Toast.makeText(getApplicationContext(), "Login Successful!", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), "Login Failed!", Toast.LENGTH_LONG).show(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

il semble qu'il y ait un article ici -> http://www.helloandroid.com/tutorials/using-ksoap2 -android-and-parsing-output-data expliquant comment faire cela. Cependant, je regarderais dans json et reposeriez l'API au lieu des Webservices SOAP si possible. –

Répondre

0

Vous pouvez utiliser cette (AsyncTask avec OnPreExecute et onPostExecute, mais sans NetworkOnMainThreadException):

class RetrieveFeedTask extends AsyncTask<String, String, String> { 

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

    @Override 
    protected String doInBackground(String... urls) { 

     String result = ""; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     request.addProperty("userName", emailText.getText().toString()); 
     request.addProperty("userPassword", passwordText.getText().toString()); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

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

     try { 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

      androidHttpTransport.call(SOAP_ACTION, envelope); 

      SoapObject result = (SoapObject) envelope.bodyIn; 
      if (result != null) { 
       result = "Login Successful!"; 
      } else { 
       result = "Login Failed!"; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected String onPostExecute(String result) { 
     super.onPostExecute(result); 

     if (result.equals("Login Successful!")) { 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), "Login Failed!", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

Merci, j'ai eu une solution avant aussi j'ai essayé votre solution, cela a fonctionné comme charme. –

3

Vous pouvez transmettre la valeur de texte des vues dans le constructeur de la tâche async et y accéder via la référence interne.

class RetrieveFeedTask extends AsyncTask<String, String, String> { 

    private String emailText, passwordText; 

    RetrieveFeedTask(String emailText, String passwordText) { 
     this.emailText = emailText; 
     this.passwordText = passwordText; 
    } 

    protected String doInBackground(String... urls) { 
     ... 
    } 
} 

Vous appelleriez alors comme si:

new RetrieveFeedTask(
     emailText.getText().toString(), 
     passwordText.getText().toString() 
).execute(); 

Sinon, vous pouvez passer des paramètres directement à doInBackground() comme un tableau.

protected Void doInBackground(String... urls) { 
    String email = urls[0];  
    String password = urls[1]; 
    .... 
} 

Et puis appelez-le comme suit:

String[] urls = { 
    emailText.getText().toString(), 
    passwordText.getText().toString() 
}; 

new RetrieveFeedTask().execute(urls); 
+0

Merci pour votre réponse j'ai fait pareil mais le problème est toujours là en disant "la méthode getText doit être appelée du fil d'interface utilisateur". –

+0

Je suis désolé, j'ai mal lu votre question. J'ai mis à jour ma réponse. Vous ne pouvez pas modifier l'état d'une vue à partir d'un thread non UI. La raison pour laquelle vous obtenez cette erreur est que doInBackground() s'exécute sur un thread non UI. – 345

+0

Merci, cela a résolu le problème, mais maintenant il dit qu'il devrait y avoir quelque chose de retour de la méthode doInBackground alors que je n'ai rien à retourner, Pouvez-vous aider à cet égard? –

0

Vous passez emailText et passwordText directement dans le AsyncTask, il vous suffit de faire quelques changements mineurs:

premier lieu de votre onClick Listener :

Chaîne de messagerie = emailText.getText(). ToString();

Chaîne mot de passe = motdepasse.getTexte(). ToChaîne();

nouveau RetrieveFeedTask(). Execute (email, mot de passe);

dans votre deuxième AsyncTask doInBackground Méthode:

Chaîne email = urls [0];

Chaîne password = urls [1];

Vous pouvez à peu près transmettre des valeurs arbitraires dans la méthode d'exécution de AsyncTask qui sont reçues en tant que paramètres dans sa méthode doInBackground.