Vaadin - как перестать ждать ответа сервера?

У меня есть страница с сеткой. Я загружаю данные через службу в сетку. Загрузка и вычисление всех данных занимает около 20-40 секунд. Когда я нажимаю кнопку для получения данных, начинается загрузка страницы (начинается загрузка классического индикатора верхней загрузки vaadin).

Мой вопрос: как я могу остановить загрузку/ожидание данных?

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

Должен ли я остановить какой-то поток? я должен использовать что-то вроде this.getUI... и где-то здесь остановить его?

Я использую ваадин 7.7.4

Спасибо :)


person NoPa147    schedule 02.08.2018    source источник


Ответы (2)


Вы должны использовать потоки для этого.

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

Чтобы обновить пользовательский интерфейс после того, как данные были получены из серверной части, вам необходимо активировать push в своем пользовательском интерфейсе.

Не забудьте синхронизировать доступ потока к пользовательскому интерфейсу с помощью чего-то вроде:

ui.access(new Runnable() {
    @Override
    public void run() {
        ...grid_update_with_new_data... ;
    }
});

Извлечение данных должно происходить вне метода ui.access, иначе ваш пользовательский интерфейс зависнет во время загрузки внутренних данных.

См. этот пост для получения более подробной технической информации

Использование потока с Vaadin? и https://vaadin.com/docs/v7/framework/advanced/advanced-push.html

person André Schild    schedule 02.08.2018
comment
Хорошо, если я реализую это, как мне перестать ждать ответа? - person NoPa147; 02.08.2018
comment
Пожалуйста, покажите свой код. Вам нужно будет запустить новый фоновый поток для долгой части. - person André Schild; 02.08.2018

@André Schild Это упрощенный код. Когда я нажимаю кнопку поиска, приложение начинает поиск, с этим проблем нет. Проблема в том, как ОСТАНОВИТЬ поиск до его завершения. Мне достаточно перестать ждать ответа и перестать загружать полосу вверху страницы, но я не знаю, как этого добиться.

@SpringComponent
@UIScope
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DistraintSearchComponent extends CustomComponent {

 @Autowired
 private Service service
 private Button searchButton = new Button("Search");

 public void init(){
  searchButton.addClickListener(new ClickListener() {

  @Override
  public void buttonClick(ClickEvent event) {
   List<Results> results = service.findByFilter(filter);
   refreshGrid(results);
  }

  });
 }
}
person NoPa147    schedule 08.08.2018