Problema com Thread (É android mas é java)

Pessoal, estou com um problema…
Quando clico em um botão, começa a tocar uma música…

Tenho uma label que fica com o status (Parado, Tocando)…
Só que não estou conseguindo que ele fique com a label “Tocando” enquanto toca a música…
Ae pensei em usar uma Thread (porque sem ela, ele não muda a label)…
Fiz assim (método chamado quando clica no botão tocar):

[code] public void play() {
//Verifica se não tá tocando
if (!mp.isPlaying()) {
mp.setDataSource(path); //seta local da musica
mp.prepare();//prepara

		status.setText("Tocando"); //Seta label pra "tocando"
		btnstop.setEnabled(false);
		btnstart.setEnabled(false);
		
		new Thread(new Runnable( )
	      {
			
	         public void run( )
	         {             
	        	 mp.start(); //Toca a música
	        	 while (mp.isPlaying()); //Enquano estiver tocando fica parado aqui
				status.setText("Parado."); //seta a label para parado			
	         }
	        
	      } ).start();	
		
	}
}[/code]

Mas depois que termina a música da um erro

Que erro?

No celular:
Desculpe!
A aplicação Record (processo br.com.pedro.Recorder) parou Inesperadamente. Tente novamente…

Não sei em que isso ajuda… A label fica tocando, e quando termina de tocar o áudio dá o erro
A Thread está correta?

[quote=pedroroxd]No celular:
Desculpe!
A aplicação Record (processo br.com.pedro.Recorder) parou Inesperadamente. Tente novamente…

Não sei em que isso ajuda… A label fica tocando, e quando termina de tocar o áudio dá o erro
A Thread está correta?[/quote]

não manjo nem de tocar musica nem de android mais… coloca todo o conteudo da sua thread dentro de um try com um catch(Throwable), imprime alguma coisa la, sei la…

Usa listener, bem mais simples. Deve haver algum evento que indique o término da música.

Esse seu while aí só serve para gastar processador de forma inadequada.

[quote=marcio_gs]Usa listener, bem mais simples. Deve haver algum evento que indique o término da música.

Esse seu while aí só serve para gastar processador de forma inadequada.[/quote]

Evento não tem…
Voce pode apenas verificar se está tocando com o if mp.isPlaying()…
Dá pra verificar a duração, mas apenas com mp.getDuration(), que retorna um int…

Continuo no aguardo, obrigado

Também estou com um problema parecido por causa de thread. Coloquei a declaração inteira da thread num try catch, mas o android simplesmente encerra a aplicação.

E aí pedroroxd, resolveu o problema?

cara, vc pode registrar um observador para quando vc altera o estado de um arquivo de audio ou video
MediaPlayer.setOnBufferingUpdateListener

tenta isso, t+

Acho que essa classe pode resolver:

Mesmo que pare inesperadamente, voce tem o log do erro no Logcat, da uma olhada lá e posta aqui.

Olá pedroroxd

O erro acontece pois por questão de segurança o android não permite que uma thread diferente da principal
atualize a interface gráfica.

Para resolver esse problema utilize um Handler. A thread então envia uma mensagem ao handler indicando qual parte da interface
deve ser atualizada.

Nada melhor que o código para entender:

    		//declaração
	private final int TOCANDO = 1;
	private final int PARADO = 2;
	private Handler handler;
	
	public void play() {  
	
		handler = new Handler() {
			public void handleMessage(Message msg) {
			
				switch(msg.what) {
				
					case TOCANDO:
						status.setText("Tocando"); //Seta label pra "tocando" 
        				break;
						
					case PARADO:
						status.setText("Parado."); //seta a label para parado
						break;
        				
        			default:
        				break;
				
				}
			
			}
		};
	
        //Verifica se não tá tocando  
        if (!mp.isPlaying()) {  
                mp.setDataSource(path); //seta local da musica  
                mp.prepare();//prepara  
				
            btnstop.setEnabled(false);  
            btnstart.setEnabled(false);  
              
            new Thread(new Runnable( )  
              {  
                  
                 public void run( )  
                 {               
                     mp.start(); //Toca a música 
					 
					 Message message = new Message();
					 message.what = TOCANDO;
					 handler.sendMessage(msg);
					 
                     while (mp.isPlaying()) //Enquano estiver tocando fica parado aqui  
					 { }
					 
					 message.what = PARADO;
					 handler.sendMessage(msg);					 
                 }  
                  
              } ).start();    
        }  
    }  

Espero que ajude, qualquer coisa pergunte.
:wink: