繁体   English   中英

使用线程时JavaFX应用程序滞后

[英]JavaFX application lagging when using Thread

我的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

            }
        }
    });
}

您基本上是在暂停UI线程,因为onPlaying是使用run方法而不是Threadstart方法调用的。 相反,你应该传递一个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等中与之交互,或者可以将其设置为守护线程,以便不阻止程序关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM