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

Composants graphiques Android Discussion :

Comment changer un TextView toutes les X secondes


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Par défaut Comment changer un TextView toutes les X secondes
    Bonjour,

    J'essaie actuellement d'afficher de manière "dynamique" des informations ( une longue chaîne de caractère) par l’intermédiaire d'un textView.
    Le problème c'est que je n’arrive pas à afficher les nouvelles informations (qui viennent écraser les anciennes).
    J'ai mit ça dans un thread (runOnUIthread) mais il ne s'affiche que les dernières informations (les précédentes ne s'affichent jamais, du moins je ne les vois pas).
    Je vous demande à vous cher camarade, si une solution existe pour solutionner mon problème ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Oui une solution existe forcément puisque la plupart des applications y arrivent sans problème.

    Mais sans le code en question difficile de dire pourquoi ca ne marche pas dans votre cas.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NavData n = new NavData();
    		n.start();
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
                    while(true) {
    		       tv.setText(n.s);
                    }
    Le s sont les informations que je veux afficher (String).

    Le NavData est un thread qui nous envoi des informations en continue.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    En programmation (et quelque soit le langage) Thread.sleep ne doit jamais être utilisé. C'est bien utile je le conçois, mais toutes les règles de programmation indique que si on l'utilise c'est qu'on s'est trompé dans la logique multi-thread.
    La même remarque vaut pour "while (true)" d'ailleurs... Eclipse peut au passage être configurer pour détecter une erreur la dessus !

    En l’occurrence, ici:

    Comme toute demande de modification de l'UI ceci doit être fait dans... le thread de l'UI, c'est à dire le thread principal de l'application (celui qui gère les énvenements, les messages etc...).
    Hors le code ne revient jamais (while (true)). Ceci devrait normalement afficher un joli "Application Not Responding" sur le terminal. Mais plus important encore, tv.setText() change bien le texte de l'objet, et va certainement bien demander un "redraw", mais comme on ne revient jamais du code, le "redraw" n'est jamais executé....

    J'imagine que NavData est un thread (n.start()), c'est donc lui qui doit "dire" à l'application qu'il est temps de mettre à jour le texte... Il existe plein de manière de faire cela:

    AsyncTask au lieu de Thread, et utiliser la fonction onProgressUpdate() pour faire le tv.setText()
    Ou passer par un Handler, créé par le thread UI, et passé à NavData pour echanger des messages.
    Ou encore conserver l'activité dans le NavData et utiliser la fonction runOnUiThread() de l'activité.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Par défaut
    Ou passer par un Handler, créé par le thread UI, et passé à NavData pour échanger des messages.
    Je ne veux pas trop t'en demander mais sincèrement, je suis tomber à plusieurs reprise sur cette solution mais j'ai vraiment du mal à voir comment coder "cette chose".

    AsyncTask au lieu de Thread, et utiliser la fonction onProgressUpdate() pour faire le tv.setText()
    Pour le AsyncTask je ne comprends ce que doit être en "paramètre" de la classe.
    Dans mon cas je l'ai définit comme cela <NavData,Void,View>

    Je te remercie de m'aider, cela m'aide énormément.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Tous les OS graphiques fonctionnent à base de "messages".
    Ces messages sont "lus" par le thread "UI", qui va déterminer une action à réaliser dessus.
    La détermination de l'action se fait par un "handler"... Donc grosso-modo, une message= 1 handler + données.
    Par exemple "Raffraichit le TextView 38289" va se faire par le handler privé de l'activité, et executer la fonction "invalidate" qui va bien de la fenêtre en question.
    Bien sur il est possible de créer plusieurs Handler dans ce thread... donc il suffit d'y faire un "myHandler = new Handler();" pour que l'on puisse empiler / gérer les messages associés...

    L'empilement de message peut être fait depuis n'importe quel thread.
    La lecture/execution des messages uniquement par le thread contenant le handler.


    AsyncTask permet de remplacer à la fois Thread & Handler. Une AsyncTask n'est pas un Thread mais y ressemble, la fonction "doInBackground()" (qui recoit en paramètres ceux passés à "execute()" sera toujours executé par une thread à part (dont on n'a pas le controle)... dans cette fonction il est possible à certains moment d'appeler updateProgress()... Cette fonction ne fait pas grand chose, juste forcer le thread "UI" à appeler onProgressUpdate(), une chance donc de mettre à jour le TextView.

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

Discussions similaires

  1. Changer une image toutes les x secondes
    Par ApocKalipsS dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/02/2010, 17h02
  2. Réponses: 3
    Dernier message: 16/06/2009, 11h29
  3. Réponses: 7
    Dernier message: 13/01/2008, 16h52
  4. Réponses: 3
    Dernier message: 11/07/2007, 15h36
  5. Comment faire un clear sur un beufferedImage toutes les x secondes!
    Par jlassiramzy dans le forum EDT/SwingWorker
    Réponses: 10
    Dernier message: 26/07/2006, 13h18

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