IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème affichage AlertDialog


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut Problème affichage AlertDialog
    Salut,

    Je dev une appli dans laquelle il est nécessaire de s'identifier. Lors de l'identification, le nom et le pass sont envoyés à un serveur qui va vérifier si ils sont correct. Si ce n'est pas le cas, je dois afficher un message disant qu'il y a une erreur d'identification.
    Le problème, c'est que ce que j'ai fais fait planter l'appli.

    Ceci est le morceau de code appelant la méthode que j'ai crée pour afficher l'AlertDialog
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if(reponse.equals("")) {
    		ident.setReponseLue(false);
    		ident.msgErreur("Erreur", "Erreur identification");
    	}
    Et voici le code de la fonction msgErreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public void msgErreur(String titre, String message) {
    		AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		builder.setMessage(message);
    		builder.setTitle(titre);
    		builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int id) {
    				IdentificationActivity.this.finish();
    			}
    		});
    		AlertDialog alert = builder.create();
    		alert.show();
    	}

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Quelle est l'erreur (stacktrace complet avec pointage vers les lignes mises en causes s'il te plaît) ?

    Là, pour le moment, les deux points que je vois :
    • c'est une NullPointerException sur response.equals("")
    • Une exception liée à l'EDT "can't create ... on a thread which have not call Looper.prepare" (quelque chose comme ça), c'est à dire que tu tenterai d'influer sur le thread graphique via un autre thread. Dans ce cas-là, appeler myActivity.runOnUiThread(new Runnable {//code ici});.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    C'est bien ça c'est une erreur NullPointerException que j'ai sur mon equals. Et elle se répète en boucle vu que j'ai un while.
    Le hic c'est que j'ai beau cherché, je vois pas comment régler le souci

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Pour éviter la NPE, tu peux faire "".equals(reponse);, mais ça ne répondra aucunement à ton besoin (afficher un message d'erreur dans le code d'une mauvaise réponse).
    Fais donc un test if (reponse == null || "".equals(reponse)).

    Pour le possible problème de communication/réponse, impossible de répondre, vu que le code n'est pas là
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Alors voila ce que me dis le Logcat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    03-27 11:24:57.550: E/IdentificationActivity(2825): S: Error
    03-27 11:24:57.550: E/IdentificationActivity(2825):	java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at android.os.Handler.<init>(Handler.java:121)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at android.app.Dialog.<init>(Dialog.java:100)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at android.app.AlertDialog.<init>(AlertDialog.java:96)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at android.app.AlertDialog$Builder.create(AlertDialog.java:891)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at projet.viametris.IdentificationActivity.msgErreur(IdentificationActivity.java:92)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at projet.viametris.ClientThread.run(ClientThread.java:57)
    03-27 11:24:57.550: E/IdentificationActivity(2825): 	at java.lang.Thread.run(Thread.java:1020)
    03-27 11:24:57.560: E/IdentificationActivity(2825): C: Error
    03-27 11:24:57.560: E/IdentificationActivity(2825): java.lang.NullPointerException
    03-27 11:24:57.560: E/IdentificationActivity(2825): 	at projet.viametris.ClientThread.run(ClientThread.java:71)
    03-27 11:24:57.560: E/IdentificationActivity(2825): 	at java.lang.Thread.run(Thread.java:1020)
    Et voici le code complet de ma méthode run() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    	public void run() {
    		// TODO Auto-generated method stub
    		try {
    			Log.d("IdentificationActivity", "C: Connecting...");
    			Socket socket = new Socket("192.168.58.22", 1234);
    			connected = true;
    			IdentificationActivity ident = (IdentificationActivity)ThreadAppelant;
    			do {
    			if(connected) {
    				try {
    					Log.d("IdentificationAcitivity", "C: Sending Command");
    					PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    					BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    					out.println("IDENT,"+nom+","+pass);
    					out.flush();
    					Log.d("IdentificationActivity", "C: Sent");
    					if(ThreadAppelant instanceof IdentificationActivity)
    					{
    						reponse = rd.readLine();
    						ident.setReponseConnection(reponse);
    						if(reponse == null || "".equals(reponse)) {
    							ident.setReponseLue(false);
    							ident.msgErreur("Erreur", "Erreur identification");
    						}
    						else {
    							ident.setReponseLue(true);
    						}
    						synchronized(ThreadAppelant) {
    							ThreadAppelant.notify();
    						}
    					}
    				}
    				catch(Exception e) {
    					Log.e("IdentificationActivity", "S: Error", e);
    				}
    			}
    			}while(ident.getReponseConnection().equals(""));
    			socket.close();
    			Log.d("IdentificationAcitivty", "C: Closed");
    		}
    		catch(Exception e) {
    			Log.e("IdentificationActivity", "C: Error", e);
    			connected = false;
    		}
     
    	}

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Gné, hé, hé, seconde erreur prévue aussi :
    Citation Envoyé par Hizin
    Une exception liée à l'EDT "can't create ... on a thread which have not call Looper.prepare" (quelque chose comme ça), c'est à dire que tu tenterai d'influer sur le thread graphique via un autre thread. Dans ce cas-là, appeler myActivity.runOnUiThread(new Runnable {//code ici});.
    Donc, tout ce que tu as à faire, c'est d'encapsuler le code servant à créer la AlertDialog dans la méthode "run()" du Runnable que tu créeras

    Pour la NPE, tu fais un "set" de ta réponse (dans le cas présent, à null), via l'instruction ident.setReponseConnection(reponse);, donc tu as de nouveau une possibilité de NPE à la ligne while(ident.getReponseConnection().equals(""));
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Citation Envoyé par Hizin
    Donc, tout ce que tu as à faire, c'est d'encapsuler le code servant à créer la AlertDialog dans la méthode "run()" du Runnable que tu créeras
    Donc ce que j'ai a faire, c'est placer le code qui créé mon AlertDialog dans la méthode run() c'est bien ça ?

    Et pour la seconde NPE, je suis censé régler le pb comment ?

  8. #8
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Citation Envoyé par Aldagon72
    Donc ce que j'ai a faire, c'est placer le code qui créé mon AlertDialog dans la méthode run() c'est bien ça ?
    Dans la méthode Run de la classe anonyme Runnable que tu créeras pour l'occasion (c'est une des possibilités).

    Citation Envoyé par Aldagon72
    Et pour la seconde NPE, je suis censé régler le pb comment ?
    De la même manière que le premier
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    je reposte le code de ma méthode run() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    	public void run() {
    		// TODO Auto-generated method stub
    		try {
    			Log.d("IdentificationActivity", "C: Connecting...");
    			Socket socket = new Socket("192.168.58.22", 1234);
    			connected = true;
    			IdentificationActivity ident = (IdentificationActivity)ThreadAppelant;
    			do {
    			if(connected) {
    				try {
    					Log.d("IdentificationAcitivity", "C: Sending Command");
    					PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    					BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    					out.println("IDENT,"+nom+","+pass);
    					out.flush();
    					Log.d("IdentificationActivity", "C: Sent");
    					if(ThreadAppelant instanceof IdentificationActivity)
    					{
    						reponse = rd.readLine();
    						ident.setReponseConnection(reponse);
    						if(reponse == null || "".equals(reponse)) {
    							ident.setReponseLue(false);
    							AlertDialog.Builder builder = new AlertDialog.Builder(this);
    							builder.setMessage("Erreur identification");
    							builder.setTitle("Erreur");
    							builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    								@Override
    								public void onClick(DialogInterface dialog, int id) {
    									ClientThread.this.finish();
    								}
    							});
    							AlertDialog alert = builder.create();
    							alert.show();
    						}
    						else {
    							ident.setReponseLue(true);
    						}
    						synchronized(ThreadAppelant) {
    							ThreadAppelant.notify();
    						}
    					}
    				}
    				catch(Exception e) {
    					Log.e("IdentificationActivity", "S: Error", e);
    				}
    			}
    			}while(ident.getReponseConnection().equals(""));
    			socket.close();
    			Log.d("IdentificationAcitivty", "C: Closed");
    		}
    		catch(Exception e) {
    			Log.e("IdentificationActivity", "C: Error", e);
    			connected = false;
    		}
     
    	}
    J'ai fais tourner l'appli en mode debug, et j'ai constaté qu'il générait une exception lors de l'exécution de la ligne 23.

  10. #10
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Citation Envoyé par Hizin
    Citation Envoyé par Hizin
    Une exception liée à l'EDT "can't create ... on a thread which have not call Looper.prepare" (quelque chose comme ça), c'est à dire que tu tenterai d'influer sur le thread graphique via un autre thread. Dans ce cas-là, appeler myActivity.runOnUiThread(new Runnable {//code ici});.
    Donc, tout ce que tu as à faire, c'est d'encapsuler le code servant à créer la AlertDialog dans la méthode "run()" du Runnable que tu créeras
    Ton erreur vient du fait que tu veuilles influer sur l'EDT dans un autre thread que le thread principal. Cela te provoque directement cette exception là, qui est relativement commune sous Android.

    Pour palier à ce problème, la classe Activity possède une méthode nommée "runOnUIThread(Runnable)".

    Il te suffit donc simplement d'invoquer cette méthode et de mettre la construction de ton AlertDialog dans le corps de la méthode run() de l'objet Runnable que tu créeras pour l'occasion, par exemple :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    if(reponse == null || "".equals(reponse)) {
    	ident.setReponseLue(false);
    	createAlertDialog("Erreur d'identification");
    [...]
     
    private void createAlertDialog(final CharSequence message)
    	{
    		//activity ici étant un attribut représentant l'activité dans laquelle ton traitement se fait (pour pouvoir lier l'AlertDialog à une interface
    		activity.runOnUiThread(new Runnable()
    			{
    				@Override
    				public void run()
    					{
    						AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    						builder.setMessage(message);
    						builder.setTitle("Erreur");
    						builder.setPositiveButton("OK", new 	DialogInterface.OnClickListener() {
    							@Override
    							public void onClick(DialogInterface dialog, int id) {
    								ClientThread.this.finish();
    							}
    						});
    						AlertDialog alert = builder.create();
    						alert.show();
    					}
    			});
    	}

    Ps : code non vérifié, je n'ai pas d'IDE avec projet Android sous la main.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    J'ai test ton code et j'ai une chose qui survient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    activity.runOnUiThread(new Runnable() {...} );
    En mettant activity, il ne me le trouve pas, je pense que c'est normal vu que je l'ai pas déclaré.
    Mais moi je mettrais à la place le nom de l'activité dans laquelle se situe le code. J'ai essayé et cela me donne :

    Cannot make a static reference to the non-static method runOnUiThread(Runnable) from the type Activity

    Sinon j'ai essayé de faire ce que me dis Eclipse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Activity activity = null;
    J'ai ensuite effectué un test en mode debug de mon code, et il ne prend même pas la peine d'entrer dans la méthode run(). Il génère une exception lorsqu'il fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    activity.runOnUiThread(new Runnable () {...} );
    Voici ce que me dis le LogCat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    03-29 08:54:22.531: E/IdentificationActivity(1086): S: Error
    03-29 08:54:22.531: E/IdentificationActivity(1086): java.lang.NullPointerException
    03-29 08:54:22.531: E/IdentificationActivity(1086): 	at projet.viametris.ClientThread.createAlertDialog(ClientThread.java:89)
    03-29 08:54:22.531: E/IdentificationActivity(1086): 	at projet.viametris.ClientThread.run(ClientThread.java:59)
    03-29 08:54:22.531: E/IdentificationActivity(1086): 	at java.lang.Thread.run(Thread.java:1020)
    Je pense que cette exception provient du fait que activity soit initialisé à null. Mais c'est la déclaration par défaut que me donne Eclipse, et je ne vois pas quoi mettre à la place.

  12. #12
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Il faut aussi que tu initialises cette variable avec quelque chose, c'est le propre des NPE pour le coup

    Là, tu as toute les cartes en main, à toi d'initialiser cette variable avec ce qu'il faut, et ce sera bon (au risque de NPE près à la ligne ident.getReponseConnection().equals(""), comme dit plus tôt).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    merci pour l'aide apporté

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  2. problème affichage image
    Par thealpacino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 30/05/2005, 13h56
  3. Problème affichage primitive
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 29/12/2004, 18h25
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 14h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo