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

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

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    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 éminent

    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
    Points : 7 618
    Points
    7 618
    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.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    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 éminent

    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
    Points : 7 618
    Points
    7 618
    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é.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    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 éminent

    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
    Points : 7 618
    Points
    7 618
    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.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci nicroman.
    Je vais essayé tous ceci et je te tiens au courant !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 31
    Points
    31
    Par défaut Interrogation ?
    Bonjour, tout le monde,

    alors j'ai lu les réponses pour la question posée.

    La question que j me pose c'est comment dire dire au programme que l'oin souhaite attendre sans utiliser de Thread.sleep(Time)

    Avec le system.currentTime() + WaitingTime ? placé dans la condition du While ?

    Sinon de nombreux tuto font références au Handler, ce qui ne devrait pas trop poser de problème à comprendre.

  9. #9
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    En fait Thread.sleep() devrait être interdit pour une simple raison: un thread attend toujours une condition, hors cette condition n'est jamais liée au temps *sauf* dans le cas d'un scheduler (cas assez particulier à mettre en oeuvre).

    Faire un "Thread.sleep(xxx)" dans le thread UI est interdit bien entendu pour les raisons évoquées plus haut: il faut que les appels au fonctions UI reviennent vite, très vite.
    Faire un "Thread.sleep(xxx)" dans un autre thread (monitoring) est inutile, puisque la tâche *sait* déjà ou elle en est... donc c'est à la tâche de signaler quand son état est modifié. Voilà pour le sleep....

    Dans une AsyncTask, l'utilisation de postProgresss (ou un truc du genre je ne me souviens plus exactement) aide grandement, puisque celà fait exactement cela: signaler au thread UI un changement d'état de la tâche. Le thread UI pouvant récupérer cet état dans onProgressUpdate.


    Sans AsyncTask, afin de "reveiller" le thread UI (et pouvoir mettre à jour le TextView) il FAUT passer par un handler... Que ce handler soit créé et géré manuellement, ou qu'il soit géré automatiquement (en utilisant la fonction "runOnUIThread()" de l'activité).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bon finalement on a réussi à rafraîchir la vue toutes les X secondes en utilisant un Timer et la fonction scheduleAtFixedRate(TimerTask). Le TimerTask est un runOnUiThread.



    Merci pour votre aide.

+ 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, 18h02
  2. Réponses: 3
    Dernier message: 16/06/2009, 12h29
  3. Réponses: 7
    Dernier message: 13/01/2008, 17h52
  4. Réponses: 3
    Dernier message: 11/07/2007, 16h36
  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, 14h18

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