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(){ 
     } 
    } 

그리고 이것은 내 BackgroundMusic 클래스 :

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); 
     } 
    } 
} 

나는 closeApp에서 musicThread.interrupt()() 메소드, 아무 일도 일어나지 않고, 여전히 MP3 파일을 사용하는 경우 연주 될 것이다. InterruptedException과 함께 catch 절을 삽입하려고 시도했지만 InterruptedException이 존재하지 않으므로 Eclipse에 항상 밑줄이 표시됩니다.

어떤 생각?

편집 : Javazoom Player를 사용하여 mp3 파일을 재생합니다. 그리고 JavaSE-1.6 환경을 사용합니다.

감사합니다.

+0

플레이어에는 미디어를 제어하기위한 컨트롤이 있어야합니다. 따라서 미디어를 제어하는 ​​객체는 공유 리소스 여야합니다. 그렇게하면 원하는대로 미디어를 제어 할 수 있습니다. 그런 다음 앱을 닫으면 플레이어가 멈 춥니 다. 또한 스레드를 활성 상태로 유지하는 조건을 다시 설계해야합니다. – Sebastian

답변

2

내가 사용하는 플레이어가 무엇인지 알 수는 없지만 playMP3.stop()을 호출하여 중지해야한다고 생각합니다. 적어도 이것은 JDK 7의 MediaPlayer이 중지되는 방법입니다.

어쨌든 차단 방법 인 것처럼 보이는 playMP3.play(); 실행 스레드를 방해하려고합니다. 때때로 중단 된 상태인지 확인하지 않습니다. 즉시 현재 트랙이 재생 완료로, 실행은이 라인에서 확인 후 중지해야합니다

while(!musicThread.isInterrupted()){ 

UPDATE 내 생각 엔 당신이이 줄을 실행하는 스레드를 방해하려는 것입니다

:

playMP3.play(); 

그리고이 방법은 차단 루틴, 그것은 Thread.interrupt()를 호출하여 중단 할 수 없습니다. 이 방법으로 작성된 것입니다. 음악을 재생하는 동안 중단 된 상태를 확인하지 않습니다.

그래서 그 대신

musicThread.interrupt()

를 호출 당신은 더 높은 수준으로 플레이어 변수를 가져오고 호출해야합니다 :

playMP3.close(); 

워드 프로세서에 따라 음악을 중지해야하는 :

public synchronized void close()- 클로버즈 t 그의 선수. 현재 재생중인 모든 오디오는 즉시 중지됩니다. .

+0

본인의 예를 들어 답을 더 정확하게 묘사 할 수 있습니까? 나는이 [link] (http://pastebin.com/vT2bkwbw)처럼 잠시 후 playMP3.close()를 넣으려고했으나 아무런 변화가 없었습니다. 내 파일은 루프에서 잘 재생되지만 앱이 닫히면 계속 재생됩니다. – mickaelb91

+0

업데이트되었습니다. 도움이 되었기를 바랍니다. –

+0

고맙습니다. 지금은 더 잘 이해하고 있습니다. 내 closeApp() 메소드에 playMp3.close()를 추가하더라도 스레드가 계속 처리 될 것이라고 믿었습니다. 하지만 '그렇지 않은 경우 스레드가 자동으로 중지됩니다. ;) – mickaelb91

관련 문제