【问题标题】:How to properly asychronously load UI component using Event Queues in ZK framework?如何在 ZK 框架中使用事件队列正确异步加载 UI 组件?
【发布时间】:2018-05-16 10:00:13
【问题描述】:

我有一个扩展 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 组件加载数据。应用程序运行没有问题,但我不确定我是否正确实施。

感谢任何建议或更正

【问题讨论】:

    标签: java zk eventqueue


    【解决方案1】:

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

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

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

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

    official docs 中描述了 EventQueue 的用法。

    基于这些,我创建了 2 个可运行的示例来说明 simplified 和更多 generic approach

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

    【讨论】:

    • 我喜欢你在这三个例子中所做的努力。并且您应该已经获得了声明/答案标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多