在JavaFx上,通常在javafx.concurrent.Service<>
上实现可重用任务。
问题是:如何管理多次触发服务的UI交互?
方法1-restart():
我可以使用service.restart(),但它会取消正在运行的任务并开始一个新任务。这不是理想的结果,因为我不想取消第一个。
方法2-start():
要能够多次使用start(),我必须这样做:
if(!isRunning()) {
reset();
start();
}
但是如果isRunning()
为true,则将忽略第二次运行。
我想阻止第二轮运行,直到第一轮运行结束,所以没有UI交互丢失。因此,我希望阻止或排队任务。
这将如何实现?
答案 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
并获取下一个元素。