jfs77 Posté(e) 4 avril 2011 Share Posté(e) 4 avril 2011 Bonjour tout le monde, J'ai un problème (un force close) lorsque que je tente de modifier un TextView depuis mon thread. J'arrive à le modifier avant, et j'arrive à modifier ma progressbar depuis le Thread. alors je ne vois vraiment pas pourquoi... voici mon code : public void jouer(){ t=new Thread(new Runnable(){ @Override public void run() { mediaPlayer.start(); textView1.setText("titi"); while(mediaPlayer.getCurrentPosition() != iduration){ try { Thread.sleep(500); progressBar.setProgress((int)mediaPlayer.getCurrentPosition()*100/iduration); textView1.setText("test"); } catch (InterruptedException e) { e.printStackTrace(); } } } }); t.start(); } Donc quand je fais mon setText() j'ai le Force Closed... Auriez vous une idée ??? Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 4 avril 2011 Share Posté(e) 4 avril 2011 Les modifications de l'IHM doivent être faites depuis le thread principal, pas depuis un thread secondaire. Dans ton cas, tu pourrais avantageusement utilser un AsyncTask pour implémenter ton thread, et bénéficier de ses mécanismes pour mettre à jour l'IHM... Lien vers le commentaire Partager sur d’autres sites More sharing options...
jfs77 Posté(e) 4 avril 2011 Auteur Share Posté(e) 4 avril 2011 Ce que je ne comprends pas c'est que ça fonctionne pour la progressBar... J'ai utilisé AsyncTask pour une autre class et je voyait pas trop la différence avec les Threads justement ! Merci pour ta réponse je vais essayer ca ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 4 avril 2011 Share Posté(e) 4 avril 2011 La différence entre AsyncTask et Thread, c'est que AsyncTask offre un mécanisme via les méthodes (onPre/PostExecute, onProgressUpdate) dans lesquelles tu peux implémenter du code qui sera exécuté dans le thread UI Lien vers le commentaire Partager sur d’autres sites More sharing options...
jfs77 Posté(e) 4 avril 2011 Auteur Share Posté(e) 4 avril 2011 Mon problème c'est qu'il y a une boucle qui tourne en permance pour afficher l'etat du mp3. Mais j'ai d'autre methode (pause, play, stop) que je dois pouvoir appeler. Donc est ce que tu me conseille de créer une classe privé juste chargé de mettre à jour ma progressBar et autre element de l'UI ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 4 avril 2011 Share Posté(e) 4 avril 2011 Tu crées une classe dérivée de AsyncTask. Dans doInBackground, tu implémentes ton traitement (ce qu'il y avait dans le run de ton thread). Dans onProgressUpdate, tu effectues la mise à jour de ton UI (progressbar, textview). Et dans ton traitement, tu appelles publishProgress au lieu de modifier directement ton UI, en passant les paramètres nécessaires, et cela appellera onProgressUpdate avec ces paramètres, en basculant d'un thread à l'autre sans avoir à s'en occuper Lien vers le commentaire Partager sur d’autres sites More sharing options...
jfs77 Posté(e) 5 avril 2011 Auteur Share Posté(e) 5 avril 2011 Bon alors je viens d'essayer, en utilisant le AsyncTask public class Joue extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... params) { mediaPlayer.start(); while(mediaPlayer.getCurrentPosition() != iduration){ try { Thread.sleep(500); publishProgress((int)mediaPlayer.getCurrentPosition()*100/iduration,mediaPlayer.getCurrentPosition()/1000); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { progressBar.setProgress(values[0]); textView1.setText(values[1]); } } Malheureusement, ca ne change pas grand chose et j'ai toujours ce problème de "Force Close"... Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 5 avril 2011 Share Posté(e) 5 avril 2011 Et quelle est l'erreur qui se produit, exactement ? Quelle est l'exception ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 5 avril 2011 Share Posté(e) 5 avril 2011 Si tu veux juste appeler setText depuis ton autre thread, tu peux utiliser runOnUiThread. Emmanuel / Alocaly Lien vers le commentaire Partager sur d’autres sites More sharing options...
jfs77 Posté(e) 6 avril 2011 Auteur Share Posté(e) 6 avril 2011 Je ne connais pas runOnUiThread je vais regarder ca. Alors finallement j'ai résolut mon problème. J'initialise mon TextView avant de faire appel au Thread (donc à la méthodedoInBackground()). Voici le code de ma classe : public class UpdateProgressBar extends AsyncTask<String, Integer, String>{ ProgressBar progressBar; MediaPlayer mediaPlayer; TextView textView; int iduration; public UpdateProgressBar(ProgressBar pb, TextView tv, MediaPlayer mp){ progressBar = pb; mediaPlayer = mp; textView = tv; iduration = mp.getDuration(); textView.setText(""+iduration); } @Override protected String doInBackground(String... params) { while(mediaPlayer.getCurrentPosition() != iduration){ try { Thread.sleep(500); publishProgress((int)mediaPlayer.getCurrentPosition()*100/iduration,mediaPlayer.getCurrentPosition()/1000); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { progressBar.setProgress(values[0]); textView.setText(""+values[1]); } } Merci beaucoup pour votre aide ! Bon je m'y remet il me reste du taf ! lol Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.