JavaFX2: ¿Puedo pausar una tarea/servicio en segundo plano?

Resuelto Lambda II asked hace 11 años • 1 respuestas

Estoy intentando configurar un servicio en segundo plano que realice una carga masiva de datos de transacciones desde un archivo csv. Este servicio en segundo plano se iniciaría desde una acción de elemento de menú asignada a un método en la clase de controlador/presentador.

Muy a menudo, aparecen algunos datos en el archivo csv para los cuales no se pueden encontrar datos maestros en la base de datos, lo que normalmente provocaría que la carga se bloquee y falle.

En tales ocasiones, me gustaría poder hacer que el servicio en segundo plano detenga su procesamiento e invoque un diálogo desde una clase de presentador para recibir la entrada del usuario. La entrada del usuario se usaría para agregar una fila maestra en la base de datos, después de lo cual el servicio en segundo plano debería reanudarse desde donde lo dejó (no desde el principio del archivo csv, sino desde la fila que causó el error).

¿Es esto posible lograrlo en JavaFX, quizás con la API javafx.concurrent? ¿Cómo haría para hacer esto?

Lambda II avatar Feb 18 '13 23:02 Lambda II
Aceptado

Solución

Cuando su proceso en segundo plano encuentre una situación en la que requiera que se le solicite entrada a un usuario, use FutureTask ejecutado en Platform.runLater para mostrarAndWait el mensaje de diálogo en el subproceso de la aplicación JavaFX. En el proceso en segundo plano, utilice FutureTask.get para pausar el proceso en segundo plano hasta que el usuario haya ingresado los valores necesarios que permitirán que el proceso continúe.


Fragmento de código de muestra

Aquí está la esencia del código para este enfoque, que se puede colocar dentro del método de llamada de su proceso en segundo plano:

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();
  }
  ...
}

Aplicación de muestra

Creé una aplicación de muestra pequeña y completa para demostrar este enfoque.

El resultado de la aplicación de ejemplo es:

solicitud de tarea demostración salida

Explicación de salida de muestra

Las líneas leídas sin valores faltantes son simplemente marrones. Las líneas con un valor de solicitud ingresado tienen un fondo verde pálido. Se leyeron catorce líneas, la tarea en segundo plano ya se detuvo una vez en la sexta línea a la que le faltaba un valor. Se le solicitó al usuario el valor faltante (que el usuario ingresó xyzzy), luego el proceso continuó hasta la línea 14, que también falta y la tarea en segundo plano se pausa nuevamente y se muestra otro cuadro de diálogo.

jewelsea avatar Feb 19 '2013 21:02 jewelsea