如何在ZK框架中使用事件队列正确地异步加载UI组件?

时间:2018-05-16 10:00:13

标签: java zk eventqueue

我有一个自定义的composer / controller类,它扩展了GenericForwardComposer。在这个类中,我有一些方法用于初始化带有数据的UI组件。这是一个非常长的操作,需要时间来完成。由于性能问题,我试图使用事件队列异步加载此数据。这样,当进程在后台运行时,它不会阻止用户访问其他功能。

在我的自定义类中,有一个启动处理的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…
}

不确定这一切是否正确。并不真正需要回调方法,因为事件(发布)本身正在使用数据加载UI组件。该应用程序运行没有问题,但我不确定我是否正确实现了这一点。

赞赏任何建议或更正

1 个答案:

答案 0 :(得分:0)

@ViewEvent似乎是Hybris特有的,不是ZK框架的一部分,这就是为什么我不能评论它。

您的示例根本不执行异步处理,事件将发布到当前线程中,ui将阻止并仅在处理完所有这些事件后返回。 (更糟糕的是,使用SESSION范围的事件队列将事件发布到该用户的所有桌面(大致是浏览器选项卡) - 很可能多次执行繁重的工作。您应该使用DESKTOP scoped event queue代替。

此外,我还不完全理解为什么你不需要回调...在进行异步处理时,你总是需要某种回调或手动创建一个线程。

特别是在ZK中,在单独的线程中执行繁重的工作至关重要。检索数据后,尽可能缩短UI,以对组件树或组件模型执行更新 - 这样可以使UI尽可能地响应用户。

EventQueue用法在official docs

中描述

根据我创建的2个可运行的示例,说明simplifiedgeneric approach

作为替代方案,您可以直接激活/停用ZK桌面,而无需使用this (my preferred) example中的事件队列。