Как правильно асинхронно загрузить компонент пользовательского интерфейса, используя Очереди событий в платформе ZK? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть собственный класс composer / controller, который расширяет GenericForwardComposer.Внутри этого класса у меня есть несколько методов, которые используются для инициализации компонентов пользовательского интерфейса с данными.Это очень длительная операция, и для ее завершения требуется время.Из-за проблем с производительностью я пытаюсь асинхронно загрузить эти данные, используя Очереди событий.Таким образом, он не будет блокировать пользователям доступ к другим функциям, пока процесс выполняется в фоновом режиме.

В моем пользовательском классе есть метод init, который запускает обработку.Этот метод вызывает несколько других методов, которые обрабатывают большую часть работы.

Я думал, что я могу использовать что-то вроде очередей событий:

public class MyWidgetController extends GenericForwardComposer
{

    public void init(final Component comp)
    { 
          //other method logic ...
          EventQueue queue = EventQueues.lookup("myQueue", EventQueues.SESSION, true); 
          queue.subscribe(this); //not sure
          queue.publish(new Event("onInitPrimaryLoad", componentA, ""));
          queue.publish(new Event("onInitSecondaryLoad", componentB, ""));
      }

    @ViewEvent(componentID = "componentA", eventName = "onInitPrimaryLoad")
    public void onInitPrimary( final Event event){ //logic }

    @ViewEvent(componentID = "componentB", eventName = "onInitSecondaryLoad")
    public void onInitSecondary( final Event event){ //logic }

    //other class methods…
}

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

Любые советы или исправления приветствуются

1 Ответ

0 голосов
/ 01 июня 2018

@ViewEvent, похоже, специфичен для Hybris и не является частью инфраструктуры ZK, поэтому я не могу это комментировать.

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

Также я не до конца понимаю, почему вам не нужен обратный вызов ... при асинхронной обработке вам всегда нужен какой-то обратный вызов или создание потока вручную.

Особенно в ZK жизненно важно выполнять тяжелую работу в отдельном потоке. Как только данные извлечены, заблокируйте пользовательский интерфейс как можно короче, чтобы выполнить обновления дерева компонентов или моделей компонентов - это сделает пользовательский интерфейс максимально отзывчивым для пользователя.

Использование EventQueue описано в официальных документах .

На основе этих данных я создаю 2 запускаемых примера, иллюстрирующих упрощенный и более общий общий подход .

В качестве альтернативы вы можете активировать / деактивировать рабочий стол ZK напрямую, не используя очереди событий, как в этом (мой предпочтительный) пример .

...