Android MediaPlayer导致无响应错误 - 释放未按预期工作

时间:2012-06-02 16:17:06

标签: android resources media-player release android-mediaplayer

我正在制作一款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

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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