Aller au contenu

[Résolu] AsyncTask pour une connexion utilisateur


jok

Recommended Posts

Bonjour,

Cela fait maintenant une semaine que je galère avec l'utilisation d'AsyncTask et malgré les nombreux tutos et la doc que j'ai lu, je suis un peu perdu. :|

En fait, j'ai deux TextView et un Button, et au clic je voudrais pouvoir vérifier si les deux TextView correspondent aux identifiants de connexion de la base de données.

Donc dans mon Activity (onClick), je fais un new Thread(new Runnable() classique, mais qui va contenir :

	  
[...]  	
//On récupère le contenu des EditText pour le comparer avec l'identifiant/mot de passe
final EditText identifiant = (EditText) findViewById(R.id.identifiantET);
final EditText motdepasse = (EditText) findViewById(R.id.motdepasseET);

if(identifiant.getText().length() > 0){
	if(motdepasse.getText().length() > 0){
               	 // Là je me pose déjà la question de comment passer ces paramètres car à mon avis c'est pas la bonne manière...
	    	new A_Connexion().execute(identifiant.toString(), motdepasse.toString());
	}
	else {
		// Erreur de mot de passe
	}
}
else {
	// Erreur identifiant
}
[...]

Ensuite dans ma classe AsyncTask, j'aimerais récupérer les deux contenus de TextView pour pouvoir faire la comparaison dans la base de données SQLite :

public class A_Connexion extends AsyncTask<String, Void, Void> {

private Activity a;
       //Classe de ma base de données, elle contient la fonction qui compare les identifiants entrés avec ceux de la table
private BaseSQLite base;

@Override
       //Comment réussir à récupérer les identifiants ici pour les passer en paramètre de comparIntervenant ?
protected Void doInBackground(String... params) {
	base = new BaseSQLite(a);

               //Les paramètres de ma fonction devraient contenir l'identifiant et le mot de passe entrés par l'utilisateur...
	base.comparIntervenant(null, null);
	return(null);
}
[...]
}

J'espère que mon problème est assez clair et que vous pourrez m'aider, sinon n'hésitez pas à demander plus de détails... Merci d'avance !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je pense qu'il ne te manque que cela :


public class A_Connexion extends AsyncTask<String, Void, Void> {

       private Activity a;
       private BaseSQLite base;

       @Override
       protected Void doInBackground(String... params) {
               base = new BaseSQLite(a);

               base.comparIntervenant(params[0], params[1]); // <--------------------- mon ajout
               return(null);
       }
[...]
}

ichpa

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton aide ichpa, c'est ce que je cherchais !

Par contre j'ai l'impression que mon AsyncTask n'est quand même pas bien appelé puisque la ligne :

new A_Connexion().execute(identifiant.toString(), motdepasse.toString());

...me renvoie une erreur. Voici le log :

03-07 14:19:42.986: ERROR/AndroidRuntime(1437): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-07 14:25:00.516: ERROR/AndroidRuntime(1569): java.lang.ExceptionInInitializerError
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at fr.flameboy.android.Connexion$2.run(Connexion.java:42)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at java.lang.Thread.run(Thread.java:1096)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at android.os.Handler.<init>(Handler.java:121)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
03-07 14:25:00.516: ERROR/AndroidRuntime(1569):     ... 2 more

EDIT : J'ai posté trop vite ! C'était du à mon "new Thread(new Runnable()" et au "public void run" que je n'avais pas enlevé !

Lien vers le commentaire
Partager sur d’autres sites

Tu sembles créer ton AysncTask au sein d'un Thread. Tu n'as pas besoin de créer de Thread dans ton Activity, c'est l'AsyncTask qui s'en charge

Lien vers le commentaire
Partager sur d’autres sites

Tu sembles créer ton AysncTask au sein d'un Thread. Tu n'as pas besoin de créer de Thread dans ton Activity, c'est l'AsyncTask qui s'en charge

Oui j'ai remarqué ça, merci ! :)

Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

Hello !

J'ai mis en résolu trop vite apparemment car j'ai encore un petit soucis avec AsyncTask, et je vois vraiment pas d'où ça vient... :(

En fait, maintenant que j'ai compris le fonctionnement, j'essaye de passer les identifiants et mots de passe au clic depuis des EditText :

new A_Connexion(this).execute(identifiant.getText().toString(), motdepasse.getText().toString());

Du coup dans mon doInBackground(), je retourne le résultat et j'affiche dans le switch case du onPostExecute() selon ce que ça renvoie. Ça me donne ça :

protected Integer doInBackground(String... params) {
	int c = base.comparIntervenant(params[0], params[1]);
	return c;
}

Dans mon fichier base :

     public int comparIntervenant(String pseudo, String motdepasse) {
   	  String rq = "SELECT * FROM " + INTERVENANT + " WHERE " + I_PSEUDO + " = \"" + pseudo + "\" AND " + I_MOTDEPASSE + " = \"" + motdepasse + "\";";
   	  int r = mBD.rawQuery(rq, null).getCount();

   	  return r;
     }

Pourtant, j'ai vérifié la requête... Mais voici ce que me donne le log :

03-29 14:11:03.502: ERROR/AndroidRuntime(1083): java.lang.NullPointerException
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at fr.flameboy.android.Connexion$1.onClick(Connexion.java:36)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.View.performClick(View.java:2364)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.View.onTouchEvent(View.java:4179)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.View.dispatchTouchEvent(View.java:3709)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.os.Looper.loop(Looper.java:123)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at android.app.ActivityThread.main(ActivityThread.java:4363)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at java.lang.reflect.Method.invokeNative(Native Method)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at java.lang.reflect.Method.invoke(Method.java:521)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-29 14:11:03.502: ERROR/AndroidRuntime(1083):     at dalvik.system.NativeStart.main(Native Method)

Cela vient-il de AsyncTask ou plutôt de la base de données ? Ou encore du thread ?

Merci d'avance...

Lien vers le commentaire
Partager sur d’autres sites

C'est dans cette fonction alors ?

if(identifiant.getText().length() > 0){ // <------ Ligne 36
   		if(motdepasse.getText().length() > 0){
   			//int c = base.comparIntervenant(identifiant.getText().toString(), motdepasse.getText().toString());
   			new A_Connexion(this).execute(identifiant.getText().toString(), motdepasse.getText().toString());
   		}
   		else {
   			String mdp = "Veuillez saisir votre mot de passe";
        	    Toast.makeText(getBaseContext(), mdp, 
          	    Toast.LENGTH_SHORT).show();
   		}
   	}
   	else {
   		String id = "Veuillez saisir votre identifiant";
    	    Toast.makeText(getBaseContext(), id, 
      	    Toast.LENGTH_SHORT).show();
   	}

Lien vers le commentaire
Partager sur d’autres sites

Tu as toutes les infos dans le log que tu nous as indiqué pour localiser l'erreur ;) (ligne 36 de Connexion.java, dans la méthode onClick d'une inner-class anonyme)

Dans ton cas, le coupable probable doit être la variable/attribut "identifiant", qui doit être nulle (à moins que ce ne soit getText() qui ai renvoyé une valeur nulle, mais il me semble que getText() sur un TextView ne peut jamais renvoyer null...)

Lien vers le commentaire
Partager sur d’autres sites

C'est ça que je ne comprends pas, c'est que ce n'est pas nul : identifiant.getText().toString() renvoie bien le contenu de la EditText, et les conditions fonctionnent bien... :/

Lien vers le commentaire
Partager sur d’autres sites

Tu as testé au debugger, et ça ne plante pas sur la ligne que tu indiques ? Quand se produit-t'elle, alors ???

Ça remarche !

Je crois qu'il fallait juste rajouter identifiant.getText().toString().length(). -_-

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...