0

私は、小さな魚として開始し、小さな魚を食べる必要がある Android ゲームアプリを作成しています。小さな魚を(泳いで)食べるたびに、音が鳴ります。これは、サウンドを再生するためのコードです。

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

これは、最初の数匹の魚に適しています。しかし、いくつかの魚を食べた後 (量はさまざまですが、約 8 ~ 11 匹の魚です)、ゲームが突然停止し、「Activity GobbleFish (アプリケーションの GobbleFish) が応答していません」というメッセージが表示されます。エラー。MediaPlayer に割り当てられているリソースが多すぎることに関係していると思われるため、mp のリソースを解放するサブを作成し、新しい MediaPlayer mp を作成しました (このサブは、魚が食べられるたびに呼び出されます)。これはサブのコードです:

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 に答える