如何处理播放音频文件的运行时异常?
我有一个按钮,它的点击监听器上播放一个音频文件。如果在音频文件播放过程中再次点击该按钮,则该应用程序会崩溃。什么是解决方案?如何处理播放音频文件的运行时异常?
这里是参考一些代码:
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环绕整个语句,并简单地捕获一个Exception。
如果您在代码失败的情况下有异常或更好的想法,那么就如何解决问题给出建议将会容易得多...事实上,您可能甚至不需要建议修理它,你可能会自己解决问题,然后你会收获自己成功的成果。每评论
更新:
为MediaPlayer文档表示可能是什么问题给出的OP是看到症状:
要停止播放,请拨打
stop()
。如果您希望以后重播媒体,则必须再次拨打start()
之前您必须使用reset()
和prepare()
MediaPlayer
对象。 (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语句,但此代码应给你一个大概的想法。
我很欣赏你在这里建议的。我已经制定了所需的代码。但是现在我希望我的按钮在播放声音时被禁用。一旦音频文件结束,我希望启用我的按钮。有关于此的任何线索? – 2010-03-15 14:02:03
你为什么不尝试抓住一个异常? – Kiril 2010-03-15 08:49:46
它从来没有在模拟器上显示我。我必须在设备上测试它。当连续点击8次或更多次时,应用程序崩溃。 我已经使用了一个名为status的公共布尔变量,并尝试将其值设置为仅在现有声音未播放时播放。不知道isPlaying()布尔方法能帮助我吗?我困在此刻。任何线索? – 2010-03-15 10:26:14
如果应用程序崩溃,我很确定它会抛出异常,所以尝试捕获异常将它写入日志,然后调试异常。 – Kiril 2010-03-15 16:16:45