Как правильно асинхронно загружать компонент пользовательского интерфейса с помощью очередей событий в ZK framework?

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

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

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

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…
}

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

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


person tony    schedule 16.05.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

person cor3000    schedule 01.06.2018
comment
Мне понравилось ваше усилие трех примеров. и вам должны были поставить отметку «претензия/ответ». - person hephestos; 11.01.2020