0

我正在制作一个 Android 游戏应用程序,你从小鱼开始,你需要吃小鱼。每次你吃一条小鱼(靠着它们游泳),就会发出声音。这是播放声音的代码:

mp = MediaPlayer.create(GobbleFishGame.this, R.raw.bite);
                if (!mPlaySound) {
                    return;
                }
mp.start();
MPRelease();

这对最初的几条鱼很有效。但是在吃了一些鱼后(数量不同,但大约是 8-11 条鱼),游戏突然停止,我得到“Activity GobbleFish(在应用程序 GobbleFish 中)没有响应”。错误。我认为这与分配给 MediaPlayer 的资源过多有关,因此我创建了一个 sub 来释放 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

提前致谢。

4

1 回答 1

1

不要在每次使用 MediaPlayer 时发布和创建它。使用您的音频源创建一次并seekTo(0)OnCompletionListener(). 然后再玩一次。

另请查看SoundPool http://developer.android.com/reference/android/media/SoundPool.html,它是为像您这样的用例而制作的,您必须多次播放相同的音频。它存储音频并按需播放。与 MediaPLayer 相比,您的音频延迟也更低。

于 2012-07-09T23:11:40.007 回答