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件事要记住

  • 如果您要多次播放相同的声音,您可能希望保留一个 Player 预取并简单地启动它多次。

  • 当你想正确清理播放器时,你应该调用 Player.close()

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

于 2012-07-17T12:58:49.953 回答
2

我想你也应该打电话

player.close() 

紧接着

player.deallocate();

根据文档“当 deallocate 返回时,播放器处于 UNREALIZED 或 REALIZED 状态。” 但 close 更进一步……“当方法返回时,Player 处于 CLOSED 状态,不能再使用。”

于 2012-07-17T12:18:45.213 回答
0

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

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

  if(player!=null){   

所以它也涵盖

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

于 2012-07-17T12:04:59.267 回答