1

私のj2meアプリケーションでは、ユーザーがアイテムをクリックするたびに小さなサウンドファイルを再生する必要があります。しかし、問題は、10〜14回後にサウンドファイルを複数回再生すると、メモリ不足の例外が発生することです。ファイルを再生するたびにプレーヤーを解放しますが、それでもメモリ不足の例外が発生します。コードスニペットは次のとおりです。

public void playSound(String soundFile) {
    try{
        if (player!=null) {   
            try {
                player.deallocate(); //deallocate the unnecessary memory.
            } catch (Exception ex) {
                player=null;  
                System.gc();
            }
        }

        player = Manager.createPlayer(getClass().getResourceAsStream(musicFolder + soundFile), "audio/mpeg");
        // player = Manager.createPlayer(is, "audio/mpeg");
        player.realize();

        // get volume control for player and set volume to max
        VolumeControl vc = (VolumeControl) player.getControl("VolumeControl");
        if (vc != null) {
            vc.setLevel(100);
        }

        player.prefetch();
        player.start();
        isException=false;
    } catch (Exception e) {

         isException=true;
    }
}

誰かが何が悪いのか教えてもらえますか?

4

3 に答える 3

3

心に留めておくべき3つのこと

  • 同じサウンドを数回再生する場合は、1 つの Player をプリフェッチしたままにして、単純に複数回開始することをお勧めします。

  • プレーヤーを適切にクリーンアップしたい場合は、 Player.close() を呼び出す必要があります

  • メディア イベント リスナーを使用して、ユーザー入力とは関係なくプレーヤーを閉じたり、再起動したりすることができます。

于 2012-07-17T12:58:49.953 に答える
2

電話もしたほうがいいと思います

player.close() 

直後

player.deallocate();

ドキュメントによると、「割り当て解除が戻ると、プレーヤーは UNREALIZED または REALIZED 状態になります。」しかし、閉じるとさらに... 「メソッドが戻ると、プレーヤーは CLOSED 状態になり、使用できなくなります。」

于 2012-07-17T12:18:45.213 に答える
0

割り当て解除が機能しない理由がわかりません。新しい割り当てを作成するよりも割り当て解除に時間がかかるか、何らかの理由で割り当て解除が失敗するかのどちらかだと思います。player.start()と一致するplayer.stop()はありますか?

試してみるもう1つのことは(他に何もないとしても、良い形で:)、必要がない/すべきでない限り、新しいプレーヤーを作成しないことです。つまり、移動します

  if(player!=null){   

だからそれはまたカバーします

    player = Manager.createPlayer(getClass().getResourceAsStream(musicFolder + soundFile), "audio/mpeg");

HTH!

于 2012-07-17T12:04:59.267 に答える