Cargar View intermedio

Hola,
Estoy intentando tener una página la cual se carga por defecto y desde que se muestre empezar a cargar otra página.
He probado varias alternativas:

  • El método enter() de View se ejecuta antes de mostrar la página por lo que no puedo hacer un navigationTo.
  • Implementar la interface ViewChangeListener y en el método afterViewChange hacer el navigationTo pero tampoco se ejecuta cuando la página se ha mostrado.

¿Hay algún método, event, listener,… que se ejecute una vez se ha mostrado una página?

ClientConnector.AttachListener?

Creo que no hay, pero podrías usar una extensión de JavaScript para realizar una RPC al servirdor y cambiar la vista desde ahí. La extensión se ejecutaría después de que el terminal haya dibujado el componente por lo que se mostraría en el navegador.

Es una solución bastante artificial, además hay que tener en cuenta que la función de inicialización en JS es global y todas la instancias utilizarían la misma.

Por ejemplo:

[code]
public class JavaScriptFunctionExtension extends AbstractJavaScriptExtension implements JavaScriptFunction {

public JavaScriptFunctionExtension() {
    String name = getClass().getName().replace(".", "_");
    JavaScript.getCurrent().addFunction(name, this);
}

@Override
public void extend(AbstractClientConnector target) {
    super.extend(target);
}

@Override
public void call(JSONArray arguments) throws JSONException {
    UI.getCurrent().getNavigator().navigateTo("someViewName");
}

}
[/code]Entonces algo como

​VerticalLayout vl = new VerticalLayout();
vl.addComponent(new Label("loading"));
JavaScriptFunctionExtension ext = new JavaScriptFunctionExtension();
ext.extend(vl);

Debería funcionar.

Hola,

La solución que opté al final es la de ejecutar un thread de fondo que cargue la página y que haga un navigateTo cuando termine.

[code]
public void enter(){

    final UI ui= getUI();
    ui.setPollInterval(1000);
    
    new Thread(){
        @Override
        public void run() {
            //synchronize session
            ui.access(new Runnable() {
                @Override
                public void run() {
                    ui.setPollInterval(0);
                    ui.getNavigator().navigateTo("bar");
                }
            });
            
        }
    }.start();
}

[/code]El único problema que tengo es que cuando lanzo el thread desde un listener no se va refrescando la pantalla sino al terminar el listener.

Me explico, quiero que se cargue una página donde va indicando los pasos que se van haciendo, el thread va actualizando esa página y al terminar hace un navigateTo, esto funciona al entrar a la aplicación pero cuando se ejecuta desde un listener no, por ejemplo cuando le doy a un botón para navegar a otra página.
¿Cómo puedo forzar a refrescar la pantalla?

La aproximación es buena.

Con el código lo que estás haciendo es que entras en una vista y basicamente defines un timer para que se vaya a consultar el estado del servidor en un segundo. Y el estado q tiene al segundo es el de la nueva vista solicitada fuera de la request. (ojo, q no es que al segundo de cargar la vista se haga el navigate)

La desventaja del polling es que no permite visualizar los cambios en tiempo real. Es decir, si tus componentes ui son modificados varias veces por el proceso durante ese intervalo sólo podrás visualizar el estado de ellos correspondientes al momento en que se ejecuta el timer. Por tanto, necesitas de alguna manera predecir el tiempo correspondiente al cambio de estado en los procesos y ajustar el intervalor de polling a ello. El problema es que el tiempo de los procesos a menudo no es tan predecible ypuedes acabar o haciendo muchas peticiones innecesarias o perdiendo estados. Te obliga también a ser cuidadoso en la forma de mostrar la información en los componentes UI, que no se puedan sobreescribir en diferentes estados del proceso.

En definitiva, lo que quiero decir es que si en el thread dura menos de un segundo y el último paso de ese thread es el navigate a la nueva vista, cuando se ejecute el timer la respuesta va a ser la nueva vista y habrás perdido todo lo intermedio.