Javafx-同时重用javafx Service <>

时间:2018-10-22 20:36:44

标签: java javafx

在JavaFx上,通常在javafx.concurrent.Service<>上实现可重用任务。

问题是:如何管理多次触发服务的UI交互?

方法1-restart():

我可以使用service.restart(),但它会取消正在运行的任务并开始一个新任务。这不是理想的结果,因为我不想取消第一个。

方法2-start():

要能够多次使用start(),我必须这样做:

if(!isRunning()) {
    reset();
    start();
}

但是如果isRunning()为true,则将忽略第二次运行。

我想阻止第二轮运行,直到第一轮运行结束,所以没有UI交互丢失。因此,我希望阻止或排队任务。

这将如何实现?

1 个答案:

答案 0 :(得分:0)

如果要阻止用户尝试一次运行两次或更多次Service,只需禁用运行Service的所有UI节点。一种方法是将disable的{​​{1}}属性绑定到Node的{​​{1}}属性。

如果要排队执行,则取决于running的要求。例如,是否需要任何输入?如果没有,只需添加一些Service变量,然后根据需要对其进行递增/递减。

Service

如果requests(或更具体地说,public class Controller { private int requests; private Service<Object> service = new Service<>() { @Override protected Task<Object> createTask() { // create and return Task... } @Override protected void succeeded() { if (requests > 0) { requests--; restart(); } } }; @FXML private void startService() { if (service.isRunning()) { requests++; } else { service.start(); } } } )确实需要输入,您仍然会做类似的事情。但是,您将使用包含每个Service所需信息的Task(或其他类似对象)而不是使用int跟踪请求数量。 Queue完成并且Task不为空时,重新启动Service并获取下一个元素。