4

我在 J2ME 中有问题重启声音。我想在构造函数中创建播放器,然后调用 playExplosion() 播放它,但它只播放一次。我正在使用无线工具包。

声音类

public class Sound () {

    private Player playerExplosion;

    public Sound() throws IOException, MediaException {
        // Explosion
        InputStream is = getClass().getResourceAsStream("/explosion.mid");
        playerExplosion = Manager.createPlayer(is, "audio/midi");
        playerExplosion.realize();
        playerExplosion.setLoopCount(1);
    }

    public void playExplosion() {
        try {
            System.out.println(playerExplosion.getState());
            playerExplosion.start();
        } catch (MediaException ex) {
            ex.printStackTrace();
        }
    }
}

MyMIDlet 类

public class MyMIDlet extends MIDlet() {

    public Sound sound;

    public MyMIDlet() {
        // Init sound object
        try {
            sound = new Sound(this);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        // Test
        System.out.println("Start");

        for (int i = 0; i < 5; i++) {
            sound.playExplosion();

            // My sound is less than 1 second.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }

        System.out.println("End");
    }
}

输出

Start
200
300
300
300
300
End

第一次, start() 之前的 playerExplosion 状态为 200(REALIZED)。

对于第 2、3、4、5 次,start() 之前的 playerExplosion 状态为 300(PRE​​FETCH)。

目前,我必须在 playExplosion() 方法中再次创建 playerExplosion,但在真实设备中它太慢了。

4

2 回答 2

2

删除后试试

playerExplosion.setLoopCount(1);
于 2012-04-11T14:35:26.660 回答
0

意识到 Player 可能是一个资源和耗时的过程,必须创建playerExplosion将意味着playerExplosion.realize();再次调用,这就是该过程需要这么多时间的原因

当您的玩家处于PREFETCHED State您需要做的事情时,您只需跟注playerExplosion.start();但它不会再次支付,因为它应该支付的次数有一般限制

消除

  playerExplosion.setLoopCount(1); 

你可以多次支付你的文件

谢谢

:)

于 2012-04-07T22:57:48.903 回答