0

У меня есть некоторые проблемы, чтобы прервать поток, который воспроизводит mp3-файл на фоне приложения. Я бы зацикливал файл, играя и останавливая его, когда приложение закрывается. Вот мой Основной класс:Прерывание нити при воспроизведении музыки

public class Main { 

     public static String musicPath = "/loop.mp3"; 
     public class RunnableMusic implements Runnable{ 
      public void run(){ 
       System.out.println("Listen... " + musicPath.replace("/", "").replace(".mp3", "").replace(".wav", "")); 
       while(!musicThread.isInterrupted()){ 
        BackgroundMusic.listen(musicPath); 
       } 
      } 
     } 
     public Thread musicThread = new Thread(new RunnableMusic()); 
     public static void main(String[] args){ 
      musicThread.start(); 
     } 
     public static closeApp(){ 
     } 
    } 

И это мой класс музыкального сопровождения:

public class BackgroundMusic{ 
    public static void listen(String music){ 
     InputStream file = BackgroundMusic.class.getResourceAsStream(music); 
     try { 
      InputStream bufferedIn = new BufferedInputStream(file); 
      Player playMP3 = new Player(bufferedIn); 
      playMP3.play(); 
      playMP3.close(); 
     } catch (Exception e) { 
      System.out.println("Couldn't play music : " + e); 
     } 
    } 
} 

Когда я использую musicThread.interrupt() в closeApp() метод, ничего не происходит, и mp3-файл еще играть. Я попытался вставить предложение catch с InterruptedException, но Eclipse всегда подчеркивает его как InterruptedException не существует ...

Любая идея?

EDIT: Я использую Javazoom Player для воспроизведения mp3-файлов. И я использую среду JavaSE-1.6.

Спасибо.

+0

Игрок должен иметь элементы управления, чтобы управлять носителями. Таким образом, объект, который управляет носителями, должен быть общим ресурсом. Таким образом, вы можете управлять медиа по своему усмотрению. Затем, когда вы закрываете приложение, вы останавливаете игрока. Кроме того, должно быть переработано условие, обеспечивающее сохранение живого потока. – Sebastian

ответ

2

Я не знаю, какой игрок вы используете, но я думаю, его нужно остановить, позвонив по телефону playMP3.stop(). По крайней мере, так MediaPlayer в JDK 7 остановлен.

В любом случае, вы пытаетесь прервать поток, выполняющийся playMP3.play();, который, как представляется, является методом блокировки, например. он не проверяет, прерывается ли оно время от времени. Как только текущая дорожка окончания воспроизведения, исполнение должно остановить после проверки на этой линии:

while(!musicThread.isInterrupted()){ 

UPDATE

Я предполагаю, что вы пытаетесь прервать поток, который работает эта линия :

playMP3.play(); 

И этот метод является обычной блокировки, она не может быть прервано вызовом Thread.interrupt(). Это просто написано так: это не проверяет прерванный статус во время воспроизведения музыки.

Таким образом, вместо вызова

musicThread.interrupt()

Вы должны взять с собой переменную игрока на более высокий уровень и называют:

playMP3.close(); 

Который должен остановить музыку согласно документации:

public synchronized void close() - Cloases t его игрока. Любой звук, воспроизводимый в настоящее время, останавливается сразу .

+0

Можете ли вы более точно рассказать мне о своем ответе на моем примере? Я попытался поместить playMP3.close() после этого, как это [ссылка] (http://pastebin.com/vT2bkwbw), но изменений нет, мой файл играет хорошо в цикле, но все еще играет, когда приложение закрыто. – mickaelb91

+0

Обновлено, надеюсь, это поможет. –

+0

Спасибо, я понимаю, теперь лучше, я думал, что поток будет продолжать обрабатываться, даже если я положу метод playMp3.close() в свой метод closeApp(). Но это не так, поток автоматически останавливается. ;) – mickaelb91

Смежные вопросы