返回

在 Vaadin 应用中如何正确显示 UI 更新?

java

如何在 Vaadin 应用中正确显示 UI 更新

在使用 Vaadin 框架构建 Web 应用时,经常需要在用户交互后或定期执行任务时更新 UI。本文将探讨在 Vaadin 应用中正确显示 UI 更新的方法,包括使用 VaadinSessionConnectorTracker 和服务器端 Push 机制。

问题

在 Vaadin 应用中使用 ScheduledExecutorService 定期执行任务,例如保存用户设置。任务完成后,我们需要向用户显示一个通知,但该通知从未显示。即使使用 UI#access 方法尝试在 UI 线程上更新,也无法显示。

解决方案

要在 Vaadin 应用中正确显示 UI 更新,需要遵循以下步骤:

使用 VaadinSession 而不是 UI#access

UI#access 适用于在 UI 线程上执行简单任务,但对于需要与多个 UI 组件交互的更复杂更新,使用 VaadinSession 更为合适。

使用 ConnectorTracker 跟踪 UI 组件

ConnectorTracker 可跟踪组件生命周期,确保在组件从 UI 树中移除之前更新它们。

使用服务器端 Push 机制

Push 机制允许服务器向客户端发送事件以更新 UI,对于显示动态数据和通知等实时更新非常有用。

示例代码

使用 VaadinSessionConnectorTracker 显示通知的示例代码如下:

private VaadinSession session = VaadinSession.getCurrent();
private ConnectorTracker connectorTracker = new ConnectorTracker();
private Notification notification = new Notification("test");

// 保存设置后更新 UI
if (saveSettingsTask.state() == Future.State.RUNNING) {
    return;
}

saveSettingsTask.cancel(false);
saveSettingsTask = SCHEDULED_EXECUTOR_SERVICE.schedule(() -> {
    // 保存设置
    saveSettings();

    // 在 VaadinSession 中运行 UI 更新
    session.lock();
    try {
        // 使用 ConnectorTracker 跟踪通知组件
        connectorTracker.listen(notification, () -> connectorTracker.remove(notification));

        // 向客户端推送更新
        session.setAttribute("vaadin-push", true);
        session.unlock();

        // 显示通知
        notification.open();
    } finally {
        session.unlock();
    }

    return null;
}, 2, TimeUnit.SECONDS);

其他注意事项

  • AppShellConfigurator 类中启用 Push
  • 确保客户端已连接到 WebSocket。
  • 避免在 UI#access 中进行耗时操作。
  • 考虑 Push 的带宽和延迟问题。

结论

遵循本文所述的方法,可以正确地在 Vaadin 应用中显示 UI 更新。VaadinSessionConnectorTracker 和服务器端 Push 机制的结合提供了对 UI 更新的强大且可靠的控制。

常见问题解答

Q1:为什么在 UI#access 中显示通知无效?

A1: UI#access 仅适用于简单的 UI 更新,而显示通知涉及与多个组件的交互,使用 VaadinSession 更为合适。

Q2:ConnectorTracker 如何确保更新组件不会从 UI 树中移除?

A2: ConnectorTracker 监听组件生命周期事件,并在组件从 UI 树中移除时将其从跟踪器中删除,防止对无效组件的更新。

Q3:Push 机制如何帮助更新 UI?

A3: Push 机制允许服务器主动向客户端发送事件,从而绕过浏览器对服务器请求的限制,实现实时 UI 更新。

Q4:如何确保客户端已连接到 WebSocket?

A4: Vaadin 使用 WebSocket 来实现 Push 机制,确保客户端在需要时建立并维护与服务器的连接。

Q5:避免在 UI#access 中进行耗时操作有哪些好处?

A5: 避免耗时操作有助于防止 UI 线程阻塞,从而提高应用程序的响应能力和用户体验。