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 :

Variable globale valorisation


Sujet :

Android

  1. #1
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut Variable globale valorisation
    Bonjour ,


    Je vais essayer d'aller directement à l'essentiel.
    Je suis dans le cadre d'une appli qui se connecte à une bdd mysql distante.

    Voici donc ma variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // message de retour du serveur à destination de l'utilisateur :
        public static String messageServeur = "";
    Le but du jeu, c'est que mon messageServeur soit valorisé avec ... ben le message renvoyé par le serveur distant , et ensuite que ce message soit envoyé à l'utilisateur via un Toast.

    Donc, j'ai une classe accesDistant avec une méthode processFinish, qui me récupère la réponse du serveur (enfin de ma page PHP liée.. whatever). Donc je me dit "facile, je valorise mon messageServeur avec le retour" :

    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
     
    public void processFinish(String output) {
            // pour vérification, affiche le contenu du retour dans la console
            Log.d("serveur", "************" + output);
            Global.messageServeur = "";
            // découpage du message reçu
            String[] message = output.split("%");
            // contrôle si le retour est correct (au moins 2 cases)
            if(message.length>1){
                Global.messageServeur = message[1];
                if(message[0].equals("Echec")){
                    Log.d("Echec","****************"+message[1]);
                    //Global.messageServeur = message[1];
     
                }else if(message[0].equals("Authentification_OK")){
                    Log.d("Authentification","****************"+message[1]);
                    //Global.messageServeur = message[1];
     
                }else if(message[0].equals("Erreur !")){
                    Log.d("Erreur !","****************"+message[1]);
     
                }
            }
        }
    Et après, sur mon activity, quand mon user clic sur le bouton "transférer", je lui envoie un Toast avec mon messageServeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AccesDistant accesDistant = new AccesDistant();
    accesDistant.envoi("enreg", convertToJSONArray(Global.listFraisMois, login, mdp));
     // envoi à l'utilisateur le message du serveur via un Toast
    Toast.makeText(ConnexionActivity.this, Global.messageServeur, Toast.LENGTH_LONG).show();
    Sauf que ... ça ne veut pas marcher comme ça.
    Pour une raison que je ne comprends pas, ma variable messageServeur part bien de Global, puis elle va dans l'activity (dans le Toast) et ensuite seulement elle est valorisée avec le retour du serveur.

    C'est ballot, avouez parce que du coup, elle a toujours un message "de retard".

    Comment je fait pour lui expliquer que dans le Toast de l'activity, il faut qu'elle soit d'abord valorisée dans mon accesDistant ?

    Y a un moyen de lui flécher le parcours ?

    D'avance merci

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ta classes AccesDistant fait très probablement un accès asynchrone.

    Donc accesDistant.envoi() retourne immédiatement , contrairement à une action bloquante et ton toast est appelé immédiatement.

    Pour palier au problème en général une fonction asynchrone prend en paramètre un callback à appeler (ici ton toast) une fois sont travail terminé, ce qui permet de garder la "chronologie" des actions
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par grunk Voir le message
    Ta classes AccesDistant fait très probablement un accès asynchrone.

    Donc accesDistant.envoi() retourne immédiatement , contrairement à une action bloquante et ton toast est appelé immédiatement.

    Pour palier au problème en général une fonction asynchrone prend en paramètre un callback à appeler (ici ton toast) une fois sont travail terminé, ce qui permet de garder la "chronologie" des actions
    Bien vu, en effet c'était un problème de thread asynchrone .... je l'ai réalisé quelques minutes après avoir posté ici (c'est souvent, expliquer le problème rencontré permet finalement ... de la comprendre)
    J'ai résolu le problème avec une variable globale "Context" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AccesDistant accesDistant = new AccesDistant();
    Global.context = ConnexionActivity.this;
    accesDistant.envoi("enreg", convertToJSONArray(Global.listFraisMois, login, mdp));
    et du coup, dans mon processFinish, je peux tranquillement l'utiliser pour envoi du Toast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(message[0].equals("Echec")){
        Log.d("Echec","****************"+message[1]);
        Toast.makeText(Global.context, message[1], Toast.LENGTH_LONG).show();
    Bon voilà, ce n'est pas très beau cette utilisation de variables globales dans un programme, mais l'appli de base était fournie ainsi, donc je suis restée sur la même logique.

    Merci

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

Discussions similaires

  1. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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