Come gestire un'eccezione di runtime sulla riproduzione di file audio?
-
20-09-2019 - |
Domanda
Ho un pulsante che riproduce un file audio sul suo click ascoltatore. Se il pulsante viene premuto di nuovo e di nuovo, mentre il file audio viene riprodotto poi l'applicazione si blocca. Qual è la soluzione?
Ecco il codice di riferimento:
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;
}
}
);
}
};
Soluzione
Due cose:
1. Debug l'incidente e vedere dove è mancata (quale linea).
2. Surround l'intera dichiarazione con un try / catch e semplicemente prendere un eccezione.
Se si dispone di un'eccezione o una migliore idea di dove il codice non riesce, allora sarà molto più facile dare consigli su come risolvere il problema ... come un dato di fatto, si potrebbe anche non avere bisogno di consigli per risolvere esso, si potrebbe finire per risolvere il problema da soli e poi si raccoglieranno i frutti del proprio successo.
Aggiornamento per commenti:
La documentazione per MediaPlayer indica ciò che potrebbe essere il problema dato i sintomi del PO è vedere:
Per interrompere la riproduzione, chiamare
stop()
. Se si desidera riprodurre in seguito i media, poi è necessarioreset()
eprepare()
l'oggettoMediaPlayer
prima di chiamarestart()
di nuovo. (Chiamatecreate()
prepare()
la prima volta).
Sembra che se il tasto play viene premuto troppe volte, allora i media possono finire per non essere in stato preparato e quindi gettare un po 'un'eccezione. L'idea di disattivare il tasto play è valido e dovrebbe occuparsi di questa situazione.
Ecco il codice illustrativo su ciò che si desidera che il programma di fare:
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();
}
};
Ovviamente si deve avere le istruzioni try / catch appropriate in là in modo la vostra applicazione non va in crash, ma questo codice dovrebbe darvi un'idea generale di cosa fare.