J2me приложение из-за нехватки памяти при многократном воспроизведении файла

В моем приложении 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 ответа

3 вещи, которые нужно иметь в виду

  • Если вы собираетесь проигрывать один и тот же звук несколько раз, вам может понадобиться предварительно выбрать одного игрока и просто запустить его несколько раз.

  • Если вы хотите правильно очистить игрока, вы должны вызвать Player.close()

  • Возможно, вы захотите использовать прослушиватель медиа-событий, чтобы закрыть и / или перезапустить проигрыватель независимо от ввода пользователя.

Я думаю, что вы также должны позвонить

player.close() 

сразу после

player.deallocate();

Согласно документации "Когда освобождение возвращается, Игрок находится в состоянии НЕРЕАЛИЗОВАНО или РЕАЛИЗОВАНО". но close идет дальше... "Когда метод возвращается, Player находится в состоянии CLOSED и больше не может использоваться".

Я не уверен, почему перераспределение не работает. Я полагаю, что или перераспределение занимает больше времени, чем создание нового, или перераспределение по какой-то причине не удается. Есть ли player.stop(), совпадающий с player.start()?

Еще одна вещь, которую стоит попробовать (если ничего, для хорошей формы:), это не создавать нового игрока, если вам не нужно / нужно. Т.е. переместить

  if(player!=null){   

Так что это также охватывает

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

НТН!

Другие вопросы по тегам