JavaFX2:我可以暂停后台任务/服务吗?

Posted

技术标签:

【中文标题】JavaFX2:我可以暂停后台任务/服务吗?【英文标题】:JavaFX2: Can I pause a background Task / Service? 【发布时间】:2013-02-03 03:58:56 【问题描述】:

我正在尝试设置一个后台服务,该服务将从 csv 文件批量加载交易数据。此后台服务将从映射到控制器/演示器类中的方法的菜单项操作启动。

经常会出现一些数据出现在 csv 文件中,而这些数据在数据库中找不到主数据,这通常会导致上传阻塞和失败。

在这种情况下,我希望能够让后台服务暂停其处理并从演示者类调用对话框以接收用户输入。用户输入将用于在数据库中添加一个主行,之后后台服务应该从它停止的地方恢复(不是从 csv 文件的开头,而是从导致错误的行)。

这是否可以在 JavaFX 中实现,也许使用 javafx.concurrent API?我该怎么做呢?

【问题讨论】:

【参考方案1】:

解决方案

当您的后台进程遇到需要提示用户输入的情况时,请使用在Platform.runLater 中执行的FutureTask 到showAndWait JavaFX 应用程序线程上的对话框提示。在后台进程中使用futureTask.get 暂停后台进程,直到用户输入允许进程继续的必要值。


示例代码片段

这里是这个方法的代码本质,可以放在你后台进程的调用方法中:

String nextText = readLineFromSource();
if ("MISSING".equals(nextText)) 
  updateMessage("Prompting for missing text");
  FutureTask<String> futureTask = new FutureTask(
    new MissingTextPrompt()
  );
  Platform.runLater(futureTask);
  nextText = futureTask.get();

...
class MissingTextPrompt implements Callable<String> 
  private TextField textField;

  @Override public String call() throws Exception 
    final Stage dialog = new Stage();
    dialog.setScene(createDialogScene());
    dialog.showAndWait();
    return textField.getText();
  
  ...


示例应用程序

我创建了a small, complete sample application 来演示这种方法。

示例应用程序的输出是:

示例输出说明

读取的没有缺失值的行只是普通的棕色。 输入提示值的行具有淡绿色背景。 已读取 14 行,后台任务已在第 6 行暂停一次,该行缺少值。提示用户输入缺少的值(用户输入了xyzzy),然后该过程一直持续到第 14 行也缺少,后台任务再次暂停并显示另一个提示对话框。

【讨论】:

太好了,这看起来可以完成这项工作。谢谢。 感谢您抽出宝贵时间提供解决方案;对此的修改似乎可以解决我的问题。但是,我在您提供的示例代码中看到了一个最奇怪的行为。如果我修改输入字符串并将第一个标记设置为“MISSING”,则程序挂起;接受用户输入的对话窗口不会弹出。但是,如果我继续调试它(在 NetBeans 7.2 中),它工作得很好。知道这里发生了什么吗? 示例代码中存在错误。该示例在容器尚未添加到场景时(正确)抛出(未报告的)NullPointerException 的任务中使用 container.getScene().getWindow()。我更改了示例中的逻辑顺序,以便在将其使用的容器添加到场景之前不会启动任务(这避免了该问题)。 Updated sample code linked. DataFX 8 包含 invokeAndWait 方法:www.datafx.io 这是一个如何编写自己的方法的示例:guigarage.com/2013/01/invokeandwait-for-javafx 非常感谢!你救了我的命

以上是关于JavaFX2:我可以暂停后台任务/服务吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以让Watch应用程序在后台运行吗?

如何增加后台任务的运行时间?

JavaFX 2:背景和 Platform.runLater 与任务/服务

当 iOS 应用程序进入后台时,是不是会暂停冗长的任务?

远程通知的后台任务在片​​刻后暂停

iOS的后台任务