Подтвердить что ты не робот

JavaFX2: Могу ли я приостановить фоновое задание/службу?

Я пытаюсь настроить фоновый сервис, который будет выполнять массовую загрузку данных транзакций из файла csv. Эта фоновая служба будет инициирована из действия элемента меню, сопоставленного с методом в классе контроллера/презентатора.

Часто так, некоторые данные появляются в файле csv, для которого в базе данных не могут быть найдены основные данные, это обычно приводит к сбою и сбою загрузки.

В таких случаях я хотел бы, чтобы фоновая служба приостанавливала его обработку и вызывала диалог из класса презентатора для ввода пользовательского ввода. Пользовательский ввод будет использоваться для добавления мастер-строки в базе данных, после чего служба фона должна возобновиться с того места, где она была остановлена ​​(не с начала файла csv, а из строки, которая вызвала ошибку).

Можно ли это реализовать в JavaFX, возможно, с помощью javafx.concurrent API? Как я могу это сделать?

4b9b3361

Ответ 1

Решение

Когда ваш фоновый процесс сталкивается с ситуацией, когда требуется, чтобы пользователь запрашивал ввод, используйте FutureTask, выполненный в Platform.runLater в 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();
  }
  ...
}

Пример приложения

Я создал небольшое, полное примерное приложение, чтобы продемонстрировать этот подход.

Вывод примерного приложения:

promptingtaskdemooutput

Пример вывода Объяснение

Линии, считанные без пропущенных значений, просто коричневые. Строки с введенным быстрым значением имеют бледно-зеленый фон. Четырнадцать строк были прочитаны, фоновая задача уже приостановлена ​​на 6-й строке, где отсутствует значение. Пользователю было предложено указать отсутствующее значение (к которому пользователь ввел xyzzy), затем процесс продолжался до тех пор, пока строка 14 не исчезнет, ​​а фоновая задача снова приостановлена, и появится диалоговое окно приглашения.