Implementing Callbacks Flow
When building the user interface with Vaadin Flow, the easiest way of allowing a background job to update the user interface is through callbacks. This is explained in more detail in the Callbacks documentation page.
Whenever you implement a callback, you have remember that the callback is called by the background thread. This means that any updates to the user interface must happen inside a call to UI.access().
| Note | The examples on this page only work with push enabled. For information about how to do that, see the Server Push documentation page. | 
For every callback, you should create a private method in your user interface. The method is called inside UI.access(), so you can safely update the user interface inside it.
For example, a method for handling successful completion could look like this:
Source code
Java
private void onJobCompleted(String result) {
    Notification.show("Job completed: " + result);
}Likewise, a method for handling errors might be done like this:
Source code
Java
private void onJobFailed(Exception error) {
    Notification.show("Job failed: " + error.getMessage());
}For reporting progress, you can use a progress bar. If the background jobs reports the progress as a floating point value between 0.0 and 1.0, you can pass it directly to the setValue method of the progress bar.
Here is an example of a button click listener that starts a background job, and uses the private methods, and the progress bar, to update the user interface:
Source code
Java
button.addClickListener(clickEvent -> {
    var ui = UI.getCurrent();
    service.startBackgroundJob(
        ui.accessLater(this::onJobCompleted, null), 1
        ui.accessLater(progressBar::setValue, null),
        ui.accessLater(this::onJobFailed, null)
    );
});- 
The UI.accessLater()method is explained on the Pushing UI Updates documentation page.