1

我在网上搜索了一些提示,但一无所获。也许我搜索错了。

我的问题是:

如何确定当前正在执行的线程是否有资格修改 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()我没有看到任何规则或模式。

谢谢你的时间,托马斯  

4

1 回答 1

3

我从 Vaadin 开发人员那里得到了答案:

Johannes Dahlström 写道:

如果有任何疑问,请使用 UI.access - 它永远不会出错。

基本上,唯一不需要它的地方(或其他锁定会话的方法)是当您知道自己处于当前正在处理客户端请求的线程中时(例如,在组件事件侦听器中)。如果您不知道是否是这种情况,例如在可以从事件侦听器或后台工作线程调用的方法中,您应该执行 UI.access 以确保,或者只是访问UI 直接并在方法的合同中记录其调用者必须注意锁定。

来源:https ://vaadin.com/forum#!/thread/4479235/4491237

于 2013-11-29T14:21:53.937 回答