我有一个问题。我正在为桌面创建JavaFX应用程序。我的应用程序中有线程在后台运行,我们假设它是从互联网上下载文件
我已经阅读了有关JavaFX中并发性的文章。有特殊的课程任务。我用Task扩展了我的课程。但它只会返回一些价值,之后就会关闭
但我需要在所有应用程序生命周期内运行此任务,并且当例如下载文件时,它应该将结果发布到UI线程,更准确地说是控制器,然后更新某些ui组件。
我知道Task有updateProgress方法,也许我可以绑定它不仅可以接收整数,还可以绑定复杂的对象
或者在我的案例中还有其他好的方法
请帮助解决这个问题。
答案 0 :(得分:2)
JavaFX为您提供ScheduledService,可以安排重复性工作。 javadoc说,
ScheduledService是一个将自动重启的服务 在成功执行之后,在某些条件下会 即使发生故障也要重启。
一个非常简单的例子是:
ScheduledService<Object> service = new ScheduledService<Object>() {
protected Task<Object> createTask() {
return new Task<Object>() {
protected Object call() {
// Connect to a Server
// Download the object
updateProgress(...);
return object; // Useful in case you want to return data, else null
}
};
}
};
service.setPeriod(Duration.seconds(10)); //Runs every 10 seconds
//bind the service progress/message properties
progressBar.progressProperty().bind(service.progressProperty());
还有非javafx方法可以实现这一点,您可以使用:
答案 1 :(得分:1)
这里最简单的方法是使用普通的旧线程:
// create new thread at start, e.g. at the end for Application.start() method
new Thread(new Runnable() {
public void run() {
while(true) {
//load my data
// once loaded
// update UI using
Platform.runLater(new Runnable() {
public void run() {
// here goes my update on FX UI thread
}
});
// update is done let's look for more data
}
}
}).start();