Cómo manejar excepción de ejecución sobre la reproducción de archivos de audio?
-
20-09-2019 - |
Pregunta
Tengo un botón que reproduce un archivo de audio en su detector de clics. Si se hace clic en el botón una y otra vez mientras que el archivo de audio se reproduce a continuación, la aplicación se bloquea. ¿Cuál es la solución?
Aquí hay un código de referencia:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
// Toast.makeText(getBaseContext(),
// "Mercy audio file is being played",
// Toast.LENGTH_LONG).show();
if (status==true)
{
mp.stop();
mp.release();
status = false;
}
else
{
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
//mp.start();
try{
mp.start();
status= true;
//mp.release();
}catch(NullPointerException e)
{
Log.v("MP error",e.toString());
}
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
status = false;
}
}
);
}
};
Solución
Dos cosas:
1. Depurar el accidente y ver donde está fallando (qué línea).
2. Surround toda la declaración con un try / catch y simplemente coger un Excepción.
Si usted tiene una excepción o una mejor idea de dónde su código está fallando, entonces será mucho más fácil dar consejos sobre cómo solucionarlo ... como una cuestión de hecho, puede que ni siquiera necesita asesoramiento para fijar ella, usted podría terminar de resolver el problema por sí mismo y luego se va a cosechar los frutos de su propio éxito.
Actualización por los comentarios:
La documentación de MediaPlayer indica lo que podría ser el problema dado que los síntomas de la OP está viendo:
Para detener la reproducción, llame
stop()
. Si desea jugar de nuevo más tarde los medios de comunicación, a continuación, debereset()
yprepare()
el objeto antes de llamarMediaPlayer
start()
nuevo. (Llamadascreate()
prepare()
primera vez.)
Parece que si el botón de reproducción se pulsa demasiadas veces, entonces los medios de comunicación pueden llegar a no estar en el estado preparado y así arrojar alguna excepción. La idea de desactivar el botón de reproducción es válida y debe hacerse cargo de esta situación.
Aquí hay un código ilustrativo de lo que usted quiere que su programa para hacer:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
if(isPressed)
{
return;
}
isPressed = true;
// create your media player
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
// set your listener
mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
if(!isPressed)
{
return;
}
isPressed = false;
// re-enable your play button
playButton.enable();
// disable the pause button
pauseButton.disable();
mp.release();
mp.prepare();
}
}
);
// disable the play button
playButton.disable();
// enable the pause button
pauseButton.enable();
// start playback
mp.start();
}
};
Por supuesto, usted debe tener las declaraciones try / catch apropiadas en ese país por lo que su aplicación no se bloquea, pero este código debe dar una idea general de qué hacer.