大家好,我的问题是我的网格无法更新数据。

我有一个从数据库获取新值的线程,但是当我从获取新值的集合中分配新的DataProvider时,网格不会更改任何内容。

例如,网格包含来自客户端的订单,如果有新订单可用,则每30秒执行一次Thread搜索,然后y在ArrayList中获取所有订单,并在网格的DataProvider中设置新的ArrayList,但是Grid继续具有相同的值像以前一样。

如何在不刷新所有网页的情况下刷新Grid中的数据?

对不起我的英语不好

谢谢。

最佳答案

轮询

您可以设置浏览器以给定间隔检查服务器是否有更新。我添加了几个代码示例,如何为此使用轮询间隔。

例如,如果您希望浏览器每30秒更新一次,则可以启用以下轮询:

MyUI ui = getMyUi();
ui.setPollInterval(30000);
if (ui.isPollListenerRegistered()) {
    Registration r = ui.addPollListener(this::reloadFromDatabase);
    ui.setPollRegistration(r);
}


将pollInterval设置为大于-1的值可使浏览器以给定的延迟调用服务器。添加轮询侦听器可让您注意到服务器上的这些检查并从数据库中加载。

如果仅需要刷新一页,则添加导航侦听器,它可以将轮询间隔设置回-1,以便其他页面不会发送不必要的轮询事件。

MyUI ui = getMyUi();
ui.setPollInterval(-1);
if (ui.isPollListenerRegistered()) {
    ui.getPollRegistration().unregister();
}


Vaadin Wiki中有一些文档,但是如果您可以从数据库中读取值,则不需要后台线程。

https://vaadin.com/wiki?p_p_id=36



使用Vaadin Push,您可以在后台更新数据,然后仅请求应更新的客户端进行刷新。这使您可以优化请求,因为客户端不会进行不必要的轮询。您也可以有一个单一请求,以从Web服务获取数据,然后使用相同的数据更新所有客户端。

您可以在Vaadin文档中阅读更多信息:

https://vaadin.com/docs/-/part/framework/advanced/advanced-push.html

我推送了一个示例项目,该项目显示了如何使用单个重复的后台线程对数据进行更新,然后使用它来更新网格的内容。完整的推入示例不止几行代码,因此您可以在此处找到代码:

https://github.com/m1kah/vaadin-grid-push

10-01 01:50
查看更多