JavaFX应用程序在使用Thread时滞后

时间:2016-02-17 10:23:14

标签: java javafx

我的JavaFX应用程序遇到了一些问题。我目前正在创建一个音乐播放器,我底部有一个滑块(类似于Spotify),它应根据歌曲的持续时间移动。

问题是我的代码在使用此线程代码时会滞后。它获取歌曲的当前持续时间,然后在进入睡眠状态1000 ms之前设置durationSlider的值。

有没有人知道解决这个滞后问题的方法?代码仍然每秒运行,但我的GUI滞后,我完全无法做任何事情。

public void startCounting(){
    mediaPlayer.setOnPlaying(new Thread() {
        @Override
        public void run() {
            Duration a;
            while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("Shit aint workin bro");
                }
                a = mediaPlayer.getCurrentTime();
                int currentTime = (int) a.toSeconds();
                System.out.println(currentTime);
                durationSlider.setValue(50.0);  //Testing the setValue() method

            }
        }
    });
}

1 个答案:

答案 0 :(得分:2)

您基本上停止了UI线程,因为使用onPlaying方法调用了run,而不是start Thread方法。相反,您应该传递Runnable来创建新的Thread并在其上调用start。请注意,正如@AntJavaDev所说,在这种情况下,应使用Platform.runLater对UI进行所有更改:

mediaPlayer.setOnPlaying(()-> {
    Thread th = new Thread() {
        @Override
        public void run() {
            Duration a;
            while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("Shit aint workin bro");
                }
                a = mediaPlayer.getCurrentTime();
                int currentTime = (int) a.toSeconds();
                System.out.println(currentTime);
                Platform.runLater(() -> durationSlider.setValue(50.0));  //Testing the setValue() method

        }
    };
    th.start();
});

您可能希望保存此Thread实例,以便在onStopped等中与其进行交互,或者将其设置为守护程序线程,因此它不会禁止程序关闭。