Java - Java Esperar a que un Service termine antes de empezar el siguiente Service

 
Vista:
sin imagen de perfil
Val: 7
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Java Esperar a que un Service termine antes de empezar el siguiente Service

Publicado por elcurioso (3 intervenciones) el 23/03/2019 14:57:32
Estoy usando Java FX. Cuando hago clic en un botón, un servicio comienza, y hace cambios en la GUI, y luego, comienza otro servicio.

Necesito esperar hasta que el primer servicio finalice los cambios de la interfaz gráfica de usuario antes de empezar el siguiente servicio.

El problema, a veces cuando se hace clic en el botón se bloquea la aplicación.


Uso "setOnSucceded", pero aún así la aplicación a veces se bloquea ... el servicio no es demasiado tedioso ... solo un setText en la etiqueta y otros cambios como setDisabled, setOpacity ... no más de 10 cambios. ..

El resumen de mi código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Button.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
 
 
            if (!service1.isRunning()) {
                service1.reset();
                service1.start();
            }
            service1.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
                @Override
                public void handle(WorkerStateEvent event) {
                    if (!service2.isRunning()) {
                        service2.reset();
                        service2.start();
                    }
                }
            });
 
        }
    });

Tal y como está a veces funciona, pero otras se bloquea la aplicación.

Necesito poder estar seguro de que el primer servicio haya hecho los cambios gráficos y estos los vea el usuario, a partir de ahí que se ejecute el segundo servicio.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Java Esperar a que un Service termine antes de empezar el siguiente Service

Publicado por Tom (1831 intervenciones) el 23/03/2019 19:36:45
Una duda ¿ Por qué usas un service para hacer "cambios gráficos" ? Y ¿ cómo es ese service1 ?
Por otra parte no creo que falle setOnSucceeded, lo que ocurrirá será que tendrás también que manejar los posibles estados de failed y/o cancelled.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 7
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Java Esperar a que un Service termine antes de empezar el siguiente Service

Publicado por elcurioso (3 intervenciones) el 24/03/2019 18:29:54
Hola Tom, gracias por contestar, utilizo un servicio debido a que es la forma de ejecutar Tasks más de una vez, y según la documentación que he leído las tareas se utilizan para trabajos medianamente largos, como es este caso, concretamente el servicio 1, es un servicio bastante corto, que hace lo siguiente:

boton1.setDisable(true);
boton2.setDisable(true);
boton3.setDisable(true);
boton4.setDisable(true);
imagen.setDisable(true);
boton1.setOpacity(0.35);
boton2.setOpacity(0.35);
boton3.setOpacity(0.35);
boton4.setOpacity(0.35);
AnchorPane.setVisible(true);
boton.setVisible(false);
label.setText("Nuevo texto");

Obviamente ese no es el naming real, pero te los he puesto así para que veas de qué tipo es cada cosa.

Mi objetivo es que esos cambios se realicen y sean visibles para el usuario de la aplicación antes de que se ejecute el siguiente servicio. No creo que se trate de los estados de failed o cancelled, pues aunque los cambios gráficos no se vean el servicio 2 se ejecuta igualmente, y en consola el servicio 1 parece ejecutarse normalmente, la aplicación se bloquea, pero veo como se ejecutan en consola.

Este bloqueo sucede a veces, no siempre.

También probé, en lugar de un servicio, a utilizar un Countdownlatch en un platform run later, declaraba el countdownlatch antes del platform run later y en el contenido de éste, ponía un try con lo mismo que el servicio que te he peusto en el post, y un final, que era el que liberaba el countdown latch, luego del platform run later estaba el .await() del countdownlatch, pero aún así, había veces que no se veían los cambios gráficos y la aplicación se bloqueaba.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Java Esperar a que un Service termine antes de empezar el siguiente Service

Publicado por Tom (1831 intervenciones) el 24/03/2019 20:05:45
Pues es que no debes hacer eso en un hilo distinto del de javaFx, probablemente te falla por eso (te estará friendo a excepciones por algún lado).
Los servicios se usan para tareas largas en background, pero no para actualizar atributos "gráficos".
Saca el código de tu service1 a una rutina que se use desde Fx (cualquier manejador de eventos, por ejemplo).
Esto está bastante bien descrito en la documentación.

https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar