我有一些问题要打断在应用程序后台播放mp3文件的线程。我会循环播放文件并在app关闭时停止播放。 这是我的主要课程:
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子句,但是Eclipse总是强调它,因为InterruptedException不存在......
有什么想法吗?
编辑:我使用Javazoom Player播放mp3文件。我使用JavaSE-1.6 Environment。
感谢。
答案 0 :(得分:2)
我不知道您正在使用的播放器是什么,但我想应该通过调用playMP3.stop()
来停止播放。至少这是JDK 7中MediaPlayer
的停止方式。
无论如何,你试图打断一个运行playMP3.play();
的线程,这似乎是一种阻塞方法,例如它不会不时检查它的中断状态。当前曲目一旦完成播放,执行应该在检查此行后停止:
while(!musicThread.isInterrupted()){
<强>更新强>
我的猜测是你试图打断运行这一行的线程:
playMP3.play();
此方法是一个阻塞例程,不能通过调用Thread.interrupt()
来中断。它只是这样写的 - 它不会在播放音乐时检查中断状态。
所以不要打电话
musicThread.interrupt()
您应该将播放器变量调到更高级别并致电:
playMP3.close();
根据文档应该停止音乐:
public synchronized void close()
- Cloases这个球员。当前播放的任何音频都会停止 立即