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):
publicvoidplay(){//Verifica se não tá tocandoif(!mp.isPlaying()){mp.setDataSource(path);//seta local da musicamp.prepare();//preparastatus.setText("Tocando");//Seta label pra "tocando"btnstop.setEnabled(false);btnstart.setEnabled(false);newThread(newRunnable(){publicvoidrun(){mp.start();//Toca a músicawhile(mp.isPlaying());//Enquano estiver tocando fica parado aquistatus.setText("Parado.");//seta a label para parado }}).start();}}
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?
maior_abandonado
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?
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…
M
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.
pedroroxd
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.
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
soaresinfo
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.
Mesmo que pare inesperadamente, voce tem o log do erro no Logcat, da uma olhada lá e posta aqui.
DeKoServidoni
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çãoprivatefinalintTOCANDO=1;privatefinalintPARADO=2;privateHandlerhandler;publicvoidplay(){handler=newHandler(){publicvoidhandleMessage(Messagemsg){switch(msg.what){caseTOCANDO:status.setText("Tocando");//Seta label pra "tocando" break;casePARADO:status.setText("Parado.");//seta a label para paradobreak;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);newThread(newRunnable(){publicvoidrun(){mp.start();//Toca a música Messagemessage=newMessage();message.what=TOCANDO;handler.sendMessage(msg);while(mp.isPlaying())//Enquano estiver tocando fica parado aqui {}message.what=PARADO;handler.sendMessage(msg);}}).start();}}