Priorizar visualización de Notification

Hola
Tengo el siguiente caso, tengo un botón con un Download que descargar un fichero desde un servidor.
En el constructor de la clase tengo:

StreamResource sr = getExcelStream();
FileDownloader fileDownloader = new FileDownloader(sr);
fileDownloader.extend(btExcel);

Siendo getExcelStream();

private StreamResource getExcelStream() {
StreamResource.StreamSource source = new StreamResource.StreamSource() {
private static final long serialVersionUID = -1413114720868341991L;

        public InputStream getStream() {
         Notification notif = null;
         try {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
         
            String contenido = l[b]

oadTable(true);
[/b]
if (contenido.isEmpty()){
notif = null;
UI.getCurrent().markAsDirtyRecursive();
notif = new Notification(traductor.getTranslation(“cosmsexportKO”), Type.ERROR_MESSAGE);
notif.setDelayMsec(2000);
notif.show(UI.getCurrent().getPage());
UI.getCurrent().markAsDirtyRecursive();
return null;
}
stream.write(Base64.decodeBase64(contenido));
InputStream input = new ByteArrayInputStream(stream.toByteArray());
return input;
} catch (Exception e) {
notif = null;
UI.getCurrent().markAsDirtyRecursive();
notif = new Notification(traductor.getTranslation(“cosmsexportKO”), Type.ERROR_MESSAGE);
notif.setDelayMsec(2000);
notif.show(UI.getCurrent().getPage());
UI.getCurrent().markAsDirtyRecursive();
return null;
}
}
};
StreamResource resource = new StreamResource ( source, “listadocontratos.xls”);
return resource;
}

El código puede estar mejor, pero no es el caso…
El problema es el siguiente, quiero que cuando llame al método:
loadTable(true);
se muestre una Notification que diga que se está bajando el fichero (
raductor.getTranslation(“cosmsexportKO”),
pero el problema es que hasta que no sale del método
getExcelStream(
) no lo hace.
Por más que he probado a poner el código de mostrar el mensaje en el Button.ClickListener… poner el markAsDirty… no he logrado hacerlo… ¿Alguien tiene alguna idea?

Un saludo

Hola,

Podrías intentar con
server push
.

[size=4]
[font=Calibri,sans-serif]
Hola, el tema con Vaadin es que todo lo ejecuta sobre el mismo hilo de la aplicación, es decir, hasta que no termine de procesar todo lo que está haciendo no actualiza la interfaz de usuario, aunque utilices el push como te sugiere Alejandro, he resuelto ese tipo de problemas ejecutando las operaciones en un hilo aparte de la aplicación y utilizando el patrón Observer para enterarme de cuando finalizó de ejecutar la operación y actualizar la interfaz, para eso si debe estar activo el push.
Este problema lo tuve cuando quise mostrar una imagen cuando se estaba procesando una operación que podía demorar un poco.

La idea era:
1-Mostrar el Indicador
2-Ejecutar la Operación
3-Ocultar la el Indicador

Pero como todo se ejecutaba en el mismo hilo y la interfaz no se actualiza hasta que termine toda la operación, nunca se mostraba el indicador.
Por eso es que ahora lo que hago es:
0-Habilito el push
1-Muestro el Indicador
2-Mando a ejecutar la operación en un hilo aparte. Me subscribo para saber cuando termina la operación.
3-Cuando termine oculto el Indicador.
4-Deshabilito el push
[/font]
[/size]

Muy bien resumido por David, gracias. Acá dejo un video donde demuestro como implementar algo parecido (en inglés):


https://vaadin.com/blog/community-answer-processing-a-file-in-a-background-thread

Así es, lo único que no escribí y me di cuenta después es que al ejecutar la operación en un hilo aparte, no se tiene acceso a todos los métodos y propiedades estáticas de Vaadin, ya que se ejecuta dentro de otro contexto, por tanto no vas a tener acceso a los métodos de Page, Session, UI, etc.
Lo que hice para ese caso fue pasar como parámetro la UI actual al hilo y a través de la misma acceder a esas propiedades en caso de que las necesites.
Recién hoy vi este forum en Español, está muy bueno.
Saludos

David, buen punto! Y bienvenido!