我有一个按钮,可以在其点击监听器上播放音频文件。如果在播放音频文件时反复单击该按钮,则应用程序崩溃。解决方案是什么?
以下是一些供参考的代码:
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;
}
}
);
}
};
答案 0 :(得分:0)
两件事:
1.调试崩溃并查看它失败的位置(哪一行)
2.使用try / catch环绕整个语句,然后只需捕获Exception。
如果你有一个例外或更好的想法代码失败的地方,那么就如何解决它提供建议会更容易......事实上,你可能甚至不需要建议来解决它,你最终可能会自己解决问题,然后你将获得自己成功的成果。
每条评论更新:
MediaPlayer的文档表明了OP看到的症状可能是什么问题:
要停止播放,请拨打
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语句,这样你的应用程序就不会崩溃,但是这段代码可以让你大致了解该怎么做。