在我的应用程序中,我所拥有的是一个持久的过程,它处理服务器中的一些微积分(某些车辆的最佳路线等)。我想向用户显示一个进度条,指示进程的当前状态。
从理论上讲,一切似乎都很容易。我的视图中有一个ProgressBar对象。此进度条将通过监听器进行更新,该监听器将写为普通接口,例如IProgressListener,其中一种方法称为notifyProgress(float pValue)。当在服务器中生成新值(运行calculate())时,将调用notifyProgress()。在我看来,它将定义一个IProgressListener的实例,它覆盖notifyProggress(float pValue)方法,该方法将执行progressBar.setValue(pValue);东西。
不幸的是,在运行我的webapp时,进度条仍然卡住,没有值更新,直到完成长时间处理。这是进度条继续进行,以100%
结束有人知道为什么会这样吗?
提前谢谢。
修改:
最后,我已经能够使它发挥作用。我已经取代了IProgressListener的使用,并且我已经实现了Observer模式。虽然看起来很奇怪,但我还没有在ui.access(() - > {// code here})之间包装UI更新;片段(否则,如果在此处介绍,UI更改将无法工作)。
答案 0 :(得分:1)
vaadin论坛上有一个值得一读的帖子,总结了这一点 - Updating UI from another thread:
Vaadin包含一个在servlet容器中运行的服务器端和一个在Web浏览器中运行的客户端。应用程序状态保持在服务器端,但是在需要时由客户端发起通信,例如,单击按钮时。
由于HTTP是请求 - 响应,因此除非直接询问服务器,否则服务器通常无法随意向客户端发送数据。有两种主要技术可以解决这个问题:
请注意,上面提到的论坛帖子提到了使用push的特殊vaadin插件,但从那以后,基于Atmosphere Framework的常规服务器推送成为了Vaadin Framework的一部分。虽然在所有现代浏览器中websockets are supported,但代理服务器或旧版浏览器可能存在问题。如果没有websockets,大气frameowrk提供各种替代自动回退。