我正在制作一款Android游戏应用,你可以从它开始做一条小鱼,你需要吃小鱼。 每当你吃一条较小的鱼(通过与它们游泳)时,就会发出声音。这是播放声音的代码:
mp = MediaPlayer.create(GobbleFishGame.this, R.raw.bite);
if (!mPlaySound) {
return;
}
mp.start();
MPRelease();
这适用于前几种鱼类。但是在吃了一些鱼之后(数量变化,但它大约是8-11条鱼),游戏突然停止,我得到“活动GobbleFish(在应用程序GobbleFish中)没有响应。”错误。我认为它与分配给MediaPlayer的资源太多有关,因此我创建了一个释放mp资源的子程序,然后创建一个新的MediaPlayer mp(每次吃掉一条鱼就调用这个子程序)。这是sub的代码:
private void MPRelease(){
MPReleaseCount += 1;
if(MPReleaseCount==5){
mp.release();
mp = new MediaPlayer();
//mp = MediaPlayer.create(GobbleFishGame.this, R.raw.bite);
//mp.reset();
MPReleaseCount=0;
}
}
当MPReleaseCount为5时,mp被释放并重新创建(因此在吃掉5条鱼之后)。 我希望这会奏效,但事实并非如此。我仍然有一个问题,吃了一些鱼(最后一次是17条鱼,所以MPRelease应该已经被调用了3次),我得到“没有响应”错误,我必须强制关闭或等待。
有谁能告诉我如何才能释放资源?因为我认为这是问题所在。我无法确定这是否是问题,因为我在Eclipse的LogCat中没有收到任何错误消息。在强制关闭应用程序后,由于“没有响应”错误,我确实收到了此错误报告:
ANR in (my activity)
Reason: keyDispatchingTimedOut
提前致谢。
答案 0 :(得分:1)
每次使用时都不要发布和创建MediaPlayer。使用您的音频源创建一次,然后在seekTo(0)
中调用OnCompletionListener()
。然后再玩一次。
另请查看SoundPool
http://developer.android.com/reference/android/media/SoundPool.html,它是针对像您这样的用户使用的,您必须多次播放相同的音频。它存储音频并按需播放。与MediaPLayer相比,您的音频延迟也更低。