2013-03-13 4 views
1

Je crée un système simple qui a un service Windows en cours d'exécution, complet avec une table d'utilisateurs, et je veux valider les informations de connexion de quelqu'un en envoyant quelque chose au service. J'essaie d'envoyer leur nom d'utilisateur et mot de passe, mais je continue d'obtenir une erreur avec ma tâche asynchrone. Je sais que vous n'êtes pas censé jouer avec des trucs d'interface utilisateur et je ne le suis pas. A l'origine, j'ai eu un appel à une autre activité là-bas mais je l'ai commenté. Maintenant, la seule chose dans doInBackground est de définir une valeur booléenne à true si la validation était bonne. A partir de là, j'ai lu la valeur après l'exécution de l'async, puis mis ensemble un paquet pour passer à l'endroit suivant. Je ne sais pas ce qui ne va pas ici. Cela fait longtemps que je n'ai pas programmé sur Android alors peut-être qu'il me manque quelque chose de stupide. Si quelqu'un pouvait m'aider, je l'apprécierais grandement! Je vous remercie. Cela pourrait également être un problème avec l'envoi de l'information au service? MISE À JOUR: Après avoir ajouté l'utilisation d'Internet dans le manifeste, si j'ai le log.d dans le programme de mon doInBackground, il s'imprime. Si je ne l'ai pas, la valeur du résultat reste fausse. Il semble qu'il y ait un certain problème avec la connexion entre mon service et Android app ...Erreur de tâche asynchrone Android avec ClientService

import java.util.ArrayList; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class LoginActivity extends Activity { 
    private static final int DATA_FROM_MAIN_ACTIVITY = 1; 
    private static final String SERVICEURL = "http://localhost:56638/ClientService.svc"; 
    private EditText userTextBox, passTextBox; 
    private Button loginButton; 
    private String uName, pass; 
    private Boolean result = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

     userTextBox = (EditText) findViewById(R.id.userTextBox); 
     passTextBox = (EditText) findViewById(R.id.passTextBox); 
     loginButton = (Button) findViewById(R.id.loginButton); 

     loginButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       uName = userTextBox.getText().toString(); 
       pass = passTextBox.getText().toString(); 

       SendLoginMessage task = new SendLoginMessage(); 
       task.execute(uName, pass); 

       if (result.equals(true)) { 
        Intent goToMainScreen = new Intent(getApplicationContext(), 
          MainActivity.class); 
        goToMainScreen.putExtra("username", uName); 
        goToMainScreen.putExtra("password", pass); 

        startActivityForResult(goToMainScreen, 
          DATA_FROM_MAIN_ACTIVITY); 
       } else { 
        Toast.makeText(
          getApplicationContext(), 
          "There was an issue with your username or password.", 
          Toast.LENGTH_LONG).show(); 
       } 

      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private class SendLoginMessage extends AsyncTask<String, String, Void> { 
     @Override 
     protected void onPreExecute() { 
      // Log.d("message almost at server, " + textFromArea, selected, 
      // null); 
     } 

     @Override 
     protected Void doInBackground(String... names) { 
      ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>(); 
      postParams.add(new BasicNameValuePair("username", names[0])); 
      postParams.add(new BasicNameValuePair("password", names[1])); 

      String response = null; 

      try { 
       response = HttpClient.executeHttpPost(SERVICEURL, postParams); 

       String newResponse = response.toString(); 
       newResponse = newResponse.replaceAll("\\s+", ""); 

       // if user was authenticated... 
       if (newResponse.equals(true)) { 
        result = true; 
        // creating an intent to take user to next page. 
        // load their DB objects on the 
        // on create in other activity 
        // pass the username/password to next activity 
        // then make a request to the server for their database 
        // objects. 
        // Intent goToMainScreen = new 
        // Intent(getApplicationContext(), MainActivity.class); 
        // goToMainScreen.putExtra("username", names[0]); 
        // goToMainScreen.putExtra("password", names[1]); 

        // startActivityForResult(goToMainScreen, 
        // DATA_FROM_MAIN_ACTIVITY); 
       } 

      } catch (Exception e) { 
       Log.d("ERROR", "exception in background"); 
      } 

      return null; 

     } 

     @Override 
     protected void onPostExecute(Void result) { 

      // Toast.makeText(getApplicationContext(), 
      // .show(); 

     } 

    } 

} 
+0

Quelle est l'erreur que vous continuez d'obtenir? – codeMagic

+0

Ceci est probablement un problème 'if (newResponse.equals (true))' il devrait être if (newResponse.equals ("true")) puisque vous comparez 'Strings' maintenant – codeMagic

+0

J'ai également ajouté l'utilisation d'Internet dans mon manifeste, mais cela n'a pas éclairci les choses. J'ai également changé le .equals à une vérification de chaîne, mais cela n'a pas fait de différence non plus. – Tastybrownies

Répondre

2

le faire comme ceci:

private class SendLoginMessage extends AsyncTask<String, String, Boolean> { 
    @Override 
    protected Boolean doInBackground(String... names) { 
     ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>(); 
     postParams.add(new BasicNameValuePair("username", names[0])); 
     postParams.add(new BasicNameValuePair("password", names[1])); 

     String response = null; 

     try { 
      response = HttpClient.executeHttpPost(SERVICEURL, postParams); 

      String newResponse = response.toString(); 
      newResponse = newResponse.replaceAll("\\s+", ""); 

      // if user was authenticated... 
      if (newResponse.equals("true")) { 
       return true; 
      } 

     } catch (Exception e) { 
      Log.d("ERROR", "exception in background"); 
     } 

     return false; 

    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
      if (result) { 
       Intent goToMainScreen = new Intent(getApplicationContext(), 
         MainActivity.class); 
       goToMainScreen.putExtra("username", uName); 
       goToMainScreen.putExtra("password", pass); 

       startActivityForResult(goToMainScreen, 
         DATA_FROM_MAIN_ACTIVITY); 
      } else { 
       Toast.makeText(
         getApplicationContext(), 
         "There was an issue with your username or password.", 
         Toast.LENGTH_LONG).show(); 
      } 
    } 

} 

et dans votre onClick() il suffit d'appeler execute()

uName = userTextBox.getText().toString(); 
pass = passTextBox.getText().toString(); 

SendLoginMessage task = new SendLoginMessage(); 
task.execute(uName, pass); 

Une fois l'exécution terminée, onPostExecute() sera appelée et votre Activity démarrera en fonction de la variable de résultat.

Ne pas vérifier votre variable de résultat après avoir appelé execute() car execute() est appelée de manière asynchrone. Au moment où vous vérifiez votre variable de résultat global, votre doInBackground() peut ne pas avoir été fini. En utilisant mon approche, vous n'avez pas besoin d'une variable globale. Veuillez lire attentivement le document avant d'utiliser un composant.

+0

Hey, merci beaucoup d'avoir commenté cela. J'ai beaucoup appris par ta façon de faire les choses. Le flux est beaucoup plus lisse et cela a plus de sens. Merci de couvrir des choses si gentilles et instructives. – Tastybrownies

Questions connexes