Aller au contenu

[Résolu] problème modification TextView depuis un Thread


jfs77

Recommended Posts

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

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

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

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

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

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...