[英]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
方法而不是Thread
的start
方法调用的。 相反,你应该传递一个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.