在 Vaadin UI 上执行异步操作

Posted

技术标签:

【中文标题】在 Vaadin UI 上执行异步操作【英文标题】:Performing Asynchronous operations on Vaadin UI 【发布时间】:2020-10-13 22:44:01 【问题描述】:

我有一个带有 Vaadin 集成 (v14) 的 Spring Boot 项目。我希望我的应用程序执行一些后台操作并在基于 Vaadin 的前端上表示结果。为此,我有一个视图,它是使用 Vaadin Designer (.js) 生成并连接到 Java 配套类的 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()),输出会根据需要打印到后端,但在尝试在 UI 上进行任何交互时不会打印..

我的java伴生类的结构如下:

@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
    
    

我是否错过了在此网页上实现异步行为的某些内容? 任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

这种情况下的问题是第一个回调以NullPointerException 终止,因为UI.getCurrent() 在后台线程运行时返回nullCompletableFuture 只会忽略异常,除非您明确处理它(例如,使用 handle 而不是 thenAccept)或阻止结果。

您可以通过在点击侦听器的开头添加UI ui = UI.getCurrent(); 来解决此问题,然后在supplyAsyncthenAccept 回调中引用ui,而不是在那里使用UI.getCurrent()

【讨论】:

感谢您的快速回复,就是这样:)

以上是关于在 Vaadin UI 上执行异步操作的主要内容,如果未能解决你的问题,请参考以下文章

C#执行异步操作的几种方式比较和总结

C#执行异步操作的几种方式比较和总结

Android --AsyncTask异步任务

AsyncTask 坑 多个task是串行执行还是并行的

android中的asynctask可不可以并行执行多个

为啥异步等待操作仍然很耗时