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環境を使用しています。

ありがとう。

4

1 に答える 1

2

使用しているプレーヤーが何であるかはわかりませんが、 を呼び出して停止する必要があると思いますplayMP3.stop()。少なくともこれはMediaPlayerJDK 7で停止する方法です。

とにかく、ブロッキングメソッドのように見える実行中のスレッドを中断しようとしています。playMP3.play();たとえば、中断された状態を時々チェックしません。現在のトラックの再生が終了するとすぐに、次の行でチェックした後に実行を停止する必要があります。

while(!musicThread.isInterrupted()){

アップデート

私の推測では、次の行を実行しているスレッドを中断しようとしていると思われます:

 playMP3.play();

また、このメソッドはブロッキング ルーチンであり、呼び出しによって中断することはできませんThread.interrupt()。このように書かれているだけです-音楽の再生中に中断ステータスをチェックしません。

だから電話する代わりに

musicThread.interrupt()

プレーヤー変数をより高いレベルに持っていき、次を呼び出す必要があります。

 playMP3.close();

ドキュメントに従って音楽を停止する必要があります:

public synchronized void close()- このプレーヤーを閉じます。現在再生中のオーディオはすぐに停止します。

于 2013-11-22T20:19:47.543 に答える