0

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

任何建议或更正表示赞赏

4

1 回答 1

2

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

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

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

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

EventQueue 的用法在官方文档中有描述。

基于这些,我创建了 2 个可运行的示例来说明简化和更通用的方法

作为替代方案,您可以直接激活/停用 ZK 桌面,而无需像此(我的首选)示例中那样使用事件队列。

于 2018-06-01T10:01:57.217 回答