大家好,我的问题是我的网格没有更新数据。
我有一个从数据库中获取新值的线程,但是当我从获取新值的集合中分配新的DataProvider时,网格不会改变任何内容。
例如,网格包含来自客户端的订单,如果有新订单可用,则每隔30秒进行一次线程搜索,然后获取ArrayList中的所有订单,并在网格的DataProvider中设置新的ArrayList,但网格继续具有与以前相同的值。
如何在不刷新所有网页的情况下刷新网格中的数据?
抱歉我的英文
谢谢。
答案 0 :(得分:2)
<强>民意测验强>
您可以将浏览器设置为以给定间隔检查服务器是否有更新。我添加了几个代码示例如何使用轮询间隔。
例如,如果您希望浏览器每30秒更新一次,那么您可以启用这样的轮询:
MyUI ui = getMyUi();
ui.setPollInterval(30000);
if (ui.isPollListenerRegistered()) {
Registration r = ui.addPollListener(this::reloadFromDatabase);
ui.setPollRegistration(r);
}
将pollInterval设置为大于-1的值会使浏览器以给定的延迟调用服务器。添加轮询侦听器允许您在服务器上注意这些检查并从数据库加载。
如果只有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
我推送了一个示例项目,该项目展示了如何使用单个重复的后台线程来更新数据,然后使用它更新网格的内容。完整的推送示例不仅仅有几行代码,因此您可以在此处找到代码: