Как обрабатывать исключение времени выполнения при воспроизведении аудиофайлов?
-
20-09-2019 - |
Вопрос
У меня есть кнопка, которая воспроизводит аудиофайл в прослушивателе кликов.Если кнопку нажимать снова и снова во время воспроизведения аудиофайла, приложение вылетает.Какое решение?
Вот код для справки:
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;
}
}
);
}
};
Решение
Две вещи:
1.Отладьте сбой и посмотрите, где происходит сбой (в какой строке).
2.Окружите весь оператор оператором try/catch и просто поймайте Исключение.
Если у вас есть исключение или вы лучше представляете, где ваш код дает сбой, вам будет гораздо проще дать вам совет, как это исправить...на самом деле, возможно, вам даже не понадобится совет, чтобы исправить это, вы можете в конечном итоге решить проблему самостоятельно, а затем пожнете плоды своего собственного успеха.
Обновление по комментариям:
Документация для Медиа плеер указывает, в чем может быть проблема, учитывая симптомы, которые видит ОП:
Чтобы остановить воспроизведение, позвоните
stop()
.Если вы хотите позже воспроизвести медиа, то вы должныreset()
иprepare()
тотMediaPlayer
объект перед вызовомstart()
снова.(create()
звонкиprepare()
первый раз.)
Похоже, что если кнопку воспроизведения нажимать слишком много раз, носитель может оказаться не в подготовленном состоянии и, таким образом, выдать какое-то исключение.Идея отключения кнопки воспроизведения верна, и она должна позаботиться об этой ситуации.
Вот примерный код того, что вы хотите, чтобы ваша программа делала:
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();
}
};
Конечно, у вас должны быть соответствующие операторы try/catch, чтобы ваше приложение не зависало, но этот код должен дать вам общее представление о том, что делать.