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 :

utiliser runOnUiThread correctement


Sujet :

Android

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut utiliser runOnUiThread correctement
    Bonjour,
    J'ai une application qui doit lire et afficher des valeurs de capteurs à intervalles réguliers. Dans une première approche "pédagogique", cette tâche est déléguée à un thread qui va devoir accéder à des widgets texte du thread UI.
    Je tourne donc depuis un moment autour de runOnUiThread en m'inspirant de moult articles du web et pour l'instant, j'en suis là.
    Mon thread UI
    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
     
    public class MainActivity extends AppCompatActivity {
     
        private TextView tv_temperature;
        private TextView tv_hygro;
        private Button btn_start, btn_stop;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            tv_temperature = (TextView) findViewById(R.id.textView_temperature);
            tv_hygro = (TextView) findViewById(R.id.textView_hygro);
            btn_start = (Button) findViewById(R.id.button_start);
            btn_stop = (Button) findViewById(R.id.button_stop);
     
            btn_start.setOnClickListener(
                    new View.OnClickListener() {
                        public void onClick(View v) {
                            WorkingThread th = new WorkingThread();
                            th.run();
                        }
                    }
            );
     
            btn_stop.setOnClickListener(
                    new View.OnClickListener() {
                        public void onClick(View v) {
                            //to write
                        }
                    }
            );
        }
     
        //mise à jour du TextView
        public void updateResults(String results) {
            tv_temperature.setText(results);
        }
    }
    mon Working thread où je ne fais que générer une valeur aléatoire pour l'afficher dans le threadUI
    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
     
    public class WorkingThread extends Thread {
        private static final String TAG = "WorkingThread";
        private static final int DELAY = 5000; // 5 seconds
        private static final int RANDOM_MULTIPLIER = 10;
     
        //constructeur du thread
        public void WorkingThread() {
            Log.v(TAG, "construct WorkingThread");
        }
     
        @Override
        public void run() {
            Log.v(TAG, "doing work in WorkingThread");
            while (true) {
                int randNum = (int) (Math.random() * RANDOM_MULTIPLIER);
                // need to publish the random number back on the UI at this point in the code through the publishProgress(randNum) call
                publishProgress(randNum);
                try {
                    Thread.sleep(DELAY);
                } catch (InterruptedException e) {
                    Log.v(TAG, "Interrupting and stopping the WorkingThread");
                    return;
                }
            }
        }
     
        private void publishProgress(int randNum) {
            Log.v(TAG, "reporting back from the WorkingThread");
            final String text = String.format(String.valueOf(R.string.service_msg), randNum);
            ((Activity)activity).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    updateResults(text);
                }
            });
        }
    }
    Mon problème: runOnUiThread() et updateResults() sont tagués "cannot resolve".
    J'en ai exploré des syntaxes mais j'en suis toujours là. J'ai le sentiment qu'il faudrait lier ça avec MainActivity mais je ne vois pas comment.
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Salut,

    AsyncTask serait mieux adaptée pour ton cas. Ça crée un thread supplémentaire qui renvoie directement le résultat après exécution au thread principal (Main Thread).


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  3. #3
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Salut,

    La classe WorkingThread est elle à l'intérieur de MainActivity?

    Si oui, depuis WorkingThread tu peux accéder aux attributs et méthodes de la classe qui l'englobe (MainActivity) sans aucune difficulté en utilisant simplement leurs noms respectifs. Et pour appeler la méthode runOnUiThread (), tu peux tranquillement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MainActivity.this.runOnUiThread( new Runnable() {
    @Override
    public void run() {
    updateResults(text);
    }
    });

    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonjour,
    j'explore toutes les possibilités d'échanges: runOnUiThread(), Message, AsyncTask pour comprendre comment ça fonctionne.
    WorkinThread est une classe indépendante qui dérive de la classe Thread. Venant du C++, je réplique ce que je sais faire dans Java.
    runOnUiThread étant une méthode de la classe Activity, il doit bien y avoir une syntaxe pour réaliser mon appel.
    Je n'ai rien inventé, je reprend des exemples de code que je décortique de sites tels stakoverflow ou codeproject mais ça ne compile pas chez moi.

  5. #5
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Il est tout a fait normal que ton code ne compile pas.

    Dans ta classe WorkingThread, tu as cette ligne :((Activity)activity).runOnUiThread(new Runnable() { où tu utilises une variable "activity" qui... n'existe pas et n'est pas défini dans la méthode ou classe.
    La méthode Activity#runOnUiThread n'est pas statique. Si tu veux l'invoquer dans ton thread, il faut que tu lui fournisses cette référence, via son constructeur par exemple).
    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

Discussions similaires

  1. Utiliser getopt correctement
    Par jujusous3 dans le forum Débuter
    Réponses: 5
    Dernier message: 01/06/2010, 01h22
  2. utiliser sscanf correctement
    Par KateA dans le forum Débuter
    Réponses: 11
    Dernier message: 02/02/2010, 14h09
  3. [Tableaux] utiliser modulo correctement
    Par jexl dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2007, 00h14
  4. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    Réponses: 2
    Dernier message: 29/09/2005, 09h56

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