使用自定义侦听器(接口)更新ProgressBar

时间:2015-03-05 13:51:24

标签: interface progress-bar listener vaadin vaadin7

在我的应用程序中,我所拥有的是一个持久的过程,它处理服务器中的一些微积分(某些车辆的最佳路线等)。我想向用户显示一个进度条,指示进程的当前状态。

从理论上讲,一切似乎都很容易。我的视图中有一个ProgressBar对象。此进度条将通过监听器进行更新,该监听器将写为普通接口,例如IProgressListener,其中一种方法称为notifyProgress(float pValue)。当在服务器中生成新值(运行calculate())时,将调用notifyProgress()。在我看来,它将定义一个IProgressListener的实例,它覆盖notifyProggress(float pValue)方法,该方法将执行progressBar.setValue(pValue);东西。

不幸的是,在运行我的webapp时,进度条仍然卡住,没有值更新,直到完成长时间处理。这是进度条继续进行,以100%

结束

有人知道为什么会这样吗?

提前谢谢。

修改

最后,我已经能够使它发挥作用。我已经取代了IProgressListener的使用,并且我已经实现了Observer模式。虽然看起来很奇怪,但我还没有在ui.access(() - > {// code here})之间包装UI更新;片段(否则,如果在此处介绍,UI更改将无法工作)。

1 个答案:

答案 0 :(得分:1)

vaadin论坛上有一个值得一读的帖子,总结了这一点 - Updating UI from another thread

  

Vaadin包含一个在servlet容器中运行的服务器端和一个在Web浏览器中运行的客户端。应用程序状态保持在服务器端,但是在需要时由客户端发起通信,例如,单击按钮时。

由于HTTP是请求 - 响应,因此除非直接询问服务器,否则服务器通常无法随意向客户端发送数据。有两种主要技术可以解决这个问题:

  1. 客户端轮询 - 客户端定期向服务器请求更新 - 例如,进度条的当前值是什么。例如,可以使用vaadin refresher add-on来实现这一点。
  2. Server Push - 服务器维护与客户端的连接(例如使用WebSockets)及时联系客户端。
  3. 请注意,上面提到的论坛帖子提到了使用push的特殊vaadin插件,但从那以后,基于Atmosphere Framework的常规服务器推送成为了Vaadin Framework的一部分。虽然在所有现代浏览器中websockets are supported,但代理服务器或旧版浏览器可能存在问题。如果没有websockets,大气frameowrk提供各种替代自动回退。