在 Vaadin 14 中使用线程更新 UI
Using Threads to Update UI in Vaadin 14
我创建了一个线程(通过 lambda 表达式)来根据用户输入字段获取一些数据,但是当我尝试在它检索数据时单击下拉菜单时,我得到了迷你进度条指示器。那么是否正在创建一个新线程?我在这里做错了什么?
Button doComputation = new Button("Get Results);
doComputation.addClickListener(event -> {
UI ui = UI.getCurrent();
new Thread(() -> {
// Do some work
ui.access(() -> layout.add(results);
}).start();
});
更新:已解决!进行了不必要的 ui.access 次调用,从而锁定了资源。感谢所有评论和帮助的人。
代码在我看来是正确的(除了 ui.access
后缺少的结束括号)。这是唯一的 ui.access
调用吗?这就是您在其中所做的一切吗?
我做了这个例子作为参考,组合框在后台任务运行时保持响应。
@Route
public class ThreadView extends VerticalLayout {
public ThreadView() {
Button runThreadButton = new Button("Start thread", e -> {
UI ui = UI.getCurrent();
new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
ui.access(() -> Notification.show("Completed"));
}).start();
});
ComboBox<String> comboBox = new ComboBox<>("Items", "One", "Two", "Three");
add(runThreadButton, comboBox);
}
}
So is a new thread even being created?
您可以通过添加 System.out.println("Thread started")
并检查是否打印了该消息来验证,或者 运行 您的应用程序处于调试模式并在您感兴趣的部分设置断点.
What am I doing wrong here?
您显示的代码看起来不错。我猜想在显示的代码之外存在问题,即您忘记了还需要添加 @Push
注释。如果没有该注解,服务器将无法直接向客户端发送消息。
我创建了一个线程(通过 lambda 表达式)来根据用户输入字段获取一些数据,但是当我尝试在它检索数据时单击下拉菜单时,我得到了迷你进度条指示器。那么是否正在创建一个新线程?我在这里做错了什么?
Button doComputation = new Button("Get Results);
doComputation.addClickListener(event -> {
UI ui = UI.getCurrent();
new Thread(() -> {
// Do some work
ui.access(() -> layout.add(results);
}).start();
});
更新:已解决!进行了不必要的 ui.access 次调用,从而锁定了资源。感谢所有评论和帮助的人。
代码在我看来是正确的(除了 ui.access
后缺少的结束括号)。这是唯一的 ui.access
调用吗?这就是您在其中所做的一切吗?
我做了这个例子作为参考,组合框在后台任务运行时保持响应。
@Route
public class ThreadView extends VerticalLayout {
public ThreadView() {
Button runThreadButton = new Button("Start thread", e -> {
UI ui = UI.getCurrent();
new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
ui.access(() -> Notification.show("Completed"));
}).start();
});
ComboBox<String> comboBox = new ComboBox<>("Items", "One", "Two", "Three");
add(runThreadButton, comboBox);
}
}
So is a new thread even being created?
您可以通过添加 System.out.println("Thread started")
并检查是否打印了该消息来验证,或者 运行 您的应用程序处于调试模式并在您感兴趣的部分设置断点.
What am I doing wrong here?
您显示的代码看起来不错。我猜想在显示的代码之外存在问题,即您忘记了还需要添加 @Push
注释。如果没有该注解,服务器将无法直接向客户端发送消息。