J2me应用程序在多个时间文件播放时出现内存异常

时间:2012-07-17 11:52:41

标签: java memory java-me mp3 mmapi

在我的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;
    }
}

有人可以告诉我出了什么问题吗?

3 个答案:

答案 0 :(得分:3)

要牢记的三件事

  • 如果您要多次播放相同的声音,您可能需要预先播放一个播放器,并且只需多次启动它。

  • 当你想要正确清理一个玩家时,你应该调用Player.close()

  • 您可能希望使用媒体事件侦听器来独立于用户输入关闭和/或重新启动播放器。

答案 1 :(得分:2)

我认为你也应该打电话

player.close() 

之后

player.deallocate();

根据文档“当deallocate返回时,播放器处于UNREALIZED或REALIZED状态。”但接近进一步......“当方法返回时,播放器处于CLOSED状态,无法再使用。”​​

答案 2 :(得分:0)

我不确定为什么取消分配不起作用。我想解除分配要比创建新分配要花费更长时间,否则解除分配会因某种原因失败。是否有一个player.stop()来匹配player.start()?

尝试的另一件事(如果没有别的,为了良好的形式:)不是创建新的播放器,除非你需要/应该。即

  if(player!=null){   

所以它也涵盖了

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

HTH!