在 Vaadin 上执行异步操作 UI
Performing Asynchronous operations on Vaadin UI
我有一个 Spring 集成了 Vaadin 的引导项目 (v14)。我希望我的应用程序执行一些后台操作并在基于 Vaadin 的前端表示结果。为此,我有一个视图,它是一个使用 Vaadin Designer (.js) 生成并连接到 Java 伴侣 class 的 Polymer 模板。对于这个视图,我只是简单地添加了一个使用以下侦听器初始化的按钮:
_btnMyTriggerButton.addClickListener(event -> {
CompletableFuture<Void> c = CompletableFuture.supplyAsync(() -> {
for (int i = 0; i < 5; i++)
{
try
{
System.out.println("Waiting");
Thread.sleep(1000);
UI.getCurrent().access(() -> {
Notification.show("Waiting");
});
}
catch (InterruptedException e)
{
}
}
return "Waiting over. Greet!";
}).thenAccept(s -> {
System.out.println(s);
UI.getCurrent().access(() -> {
Notification.show(s);
});
});
我正在尝试按照文档所述访问 UI。然而,当它被执行时,它只会到达第一个“等待”,然后停止。如果我删除 UI 交互 (Notification.show()) 输出将根据需要打印到后端,但在尝试对 [= 进行任何交互时不会31=]..
我的 java 同伴 class 的结构如下:
@Tag("my-view")
@JsModule("./my-view.js")
@Route("")
@Push(PushMode.AUTOMATIC)
public class MyView extends PolymerTemplate<MyView.MyModel>
{
@Id("trigger-button")
private Button _btnMyTriggerButton;
MyView() {
// listener initialization code described above
}
public interface MyModel extends TemplateModel
{
}
}
我是否错过了在此网页上实现异步行为的某些内容?
感谢任何帮助。
这种情况下的问题是第一个回调以 NullPointerException
终止,因为 UI.getCurrent()
returns null
当它来自后台线程时 运行 . CompletableFuture
将忽略异常,除非您明确处理它(例如使用 handle
而不是 thenAccept
)或阻止结果。
您可以通过在点击侦听器的开头添加 UI ui = UI.getCurrent();
然后在 supplyAsync
和 thenAccept
回调中引用 ui
而不是使用 UI.getCurrent()
那里。
我有一个 Spring 集成了 Vaadin 的引导项目 (v14)。我希望我的应用程序执行一些后台操作并在基于 Vaadin 的前端表示结果。为此,我有一个视图,它是一个使用 Vaadin Designer (.js) 生成并连接到 Java 伴侣 class 的 Polymer 模板。对于这个视图,我只是简单地添加了一个使用以下侦听器初始化的按钮:
_btnMyTriggerButton.addClickListener(event -> {
CompletableFuture<Void> c = CompletableFuture.supplyAsync(() -> {
for (int i = 0; i < 5; i++)
{
try
{
System.out.println("Waiting");
Thread.sleep(1000);
UI.getCurrent().access(() -> {
Notification.show("Waiting");
});
}
catch (InterruptedException e)
{
}
}
return "Waiting over. Greet!";
}).thenAccept(s -> {
System.out.println(s);
UI.getCurrent().access(() -> {
Notification.show(s);
});
});
我正在尝试按照文档所述访问 UI。然而,当它被执行时,它只会到达第一个“等待”,然后停止。如果我删除 UI 交互 (Notification.show()) 输出将根据需要打印到后端,但在尝试对 [= 进行任何交互时不会31=]..
我的 java 同伴 class 的结构如下:
@Tag("my-view")
@JsModule("./my-view.js")
@Route("")
@Push(PushMode.AUTOMATIC)
public class MyView extends PolymerTemplate<MyView.MyModel>
{
@Id("trigger-button")
private Button _btnMyTriggerButton;
MyView() {
// listener initialization code described above
}
public interface MyModel extends TemplateModel
{
}
}
我是否错过了在此网页上实现异步行为的某些内容? 感谢任何帮助。
这种情况下的问题是第一个回调以 NullPointerException
终止,因为 UI.getCurrent()
returns null
当它来自后台线程时 运行 . CompletableFuture
将忽略异常,除非您明确处理它(例如使用 handle
而不是 thenAccept
)或阻止结果。
您可以通过在点击侦听器的开头添加 UI ui = UI.getCurrent();
然后在 supplyAsync
和 thenAccept
回调中引用 ui
而不是使用 UI.getCurrent()
那里。