我在网上搜索了一些提示,但一无所获。也许我错了。
我的问题是:
如何确定当前正在执行的线程是否有资格修改UI组件?
这就是我现在为UI更新所做的事情:
UI.getCurrent().access(new Runnable() {
@Override
public void run() {
//modify some ui
}
});
在某些情况下,我不必这样做,它可以立即在当前的线程中工作,但有时不会,我得到一个错误。
当我比较Runnable和Runnable外部的线程时 - 它完全相同= http-bio-8080-exec-10
从代码中我可以做些什么来了解这是调用UI.getCurrent()。access()的正确位置还是立即执行?
我尝试搜索线程中的差异查找:VaadinService.getCurrentResponse()
和VaadinService.getCurrentRequest()
,但我没有看到任何规则或模式。
谢谢你的时间, 托马斯
答案 0 :(得分:3)
我得到了Vaadin开发人员的回答:
JohannesDahlström写道:
如果有任何疑问,请使用UI.access - 它永远不会出错。
基本上,您不需要它的唯一地方(或其他一些锁定会话的方法)就是当您知道您正处于当前处理客户端请求的线程中时(例如,在组件事件侦听器中) )。如果你不知道是否是这种情况,例如在一个可以从事件监听器或后台工作线程调用的方法中,你应该做UI.access只是为了确定,或者只是简单地访问UI直接并在方法的合同中记录其调用者必须处理锁定。