Обновить UI из другого вида (Vaadin-версия 7.7.12) - PullRequest
0 голосов
/ 08 мая 2020

В настоящее время я столкнулся с проблемой обновления пользовательского интерфейса из другого представления, сценарий выглядит следующим образом

public class myWindow extends Window{

private UI ui;

@Autowired
private AbcPresenter abcpresenter;

@Override
    public void attach() {
        super.attach();
        ui = getUI();
    }

private void saveData(){
    ui.setPollInterval(1000);
        mainUI.showSpinner();//Vaadin progressbar setting visible true
         abcpresenter.saveData(param,param);
         UI.setCurrent(ui);
        close();
}

public void notifyUsers(){
try{
ui.access(() -> {
           mainUI. .hideSpinner();//hide vaadin progress bar
            Notification.show("Task done"));
        });
}catch(Exception e){
    e.printStackTrace();
}

}   

}

//here is my presenter
public class AbcPresenter(){

@Async
public void saveData(args...){
    //saving action done then notify again to myWindow class
    myWindow.notifyUsers();

}

Проблема все еще существует, как будто она работает. я не могу получить уведомление .. !!

может быть проблема с @ Asyn c?

Я беспокоюсь, что потоки не могут общаться, как это будет 2 потока в соответствии с кодом, как будто что-то отсутствует, что не делает запрос к серверу для обновления пользовательского интерфейса, потому что, как только процесс запускается и если пользователь переходит к другим представлениям (у меня есть боковая панель, из которой я перехожу к другому представлению из текущего представления (в котором процесс выполняется в фоновом режиме) Я не вижу уведомления.

Я сомневаюсь в следующих вещах .. !! 1) Закрытие окна (я вызываю метод уведомления) 2) @ Asyn c аннотация 3) связь между потоками для обновления сервера

1 Ответ

0 голосов
/ 10 мая 2020

Я решил эту проблему с помощью многих проб и ошибок.

Сначала необходимо понимать разницу между pu sh и опросом в vaadin

Я использовал опрос, что означает клиент каждую секунду запрашивал сервер для обновления.

Но мой сценарий был другим, так как я продолжал выполнять процесс в обратном потоке, и мне нужно обновление в любом пользовательском интерфейсе в моем приложении, в котором процесс был готово .. !!

Так что для этого мне нужен механизм pu sh, который сервер информирует клиента после того, как работа сделана .. !!

Я пробовал с manual pu sh и automati c pu sh

по приведенному ниже коду добавьте в pom. xml

<dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-push</artifactId>
</dependency>

Следующим шагом является добавление класса In MainUI, который расширяет UI

код ниже

@Push
@SpringUI
public class MainUI extends UI {
}

Затем я попробовал с режимом pu sh, например PushMode.MANUAL и PushMode.AUTOMATI C код ниже

@Push(value = PushMode.MANUAL)
@SpringUI
public class MainUI extends UI {
}

и

@Push(value = PushMode.AUTOMATIC)
@SpringUI
public class MainUI extends UI {
}

это само по себе не сработало, поэтому транспортный режим у меня работает прозрачно ort = Transport.LONG_POLLING

код такой, как показано ниже. PushMode Я сохранил Вручную, лучше оставить MANUAL

@Push(value = PushMode.MANUAL, transport = Transport.LONG_POLLING)
@SpringUI
public class MainUI extends UI {
}

Transport.LONG_POLLING - это длинный запрос Get, сохраняемый между сервером и клиентом для обновления .. !!

и метод, в котором я вручную sh, это

public void notifyUsers() {
        getUI().access(() -> {
        mainUI.hideSpinner();
        Notification.show.info("Task done");
        ui.push();
      });
   }

Надеюсь, мое объяснение поможет .. !!

...