我有一个自定义的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组件。该应用程序运行没有问题,但我不确定我是否正确实现了这一点。
赞赏任何建议或更正
答案 0 :(得分:0)
@ViewEvent似乎是Hybris特有的,不是ZK框架的一部分,这就是为什么我不能评论它。
您的示例根本不执行异步处理,事件将发布到当前线程中,ui将阻止并仅在处理完所有这些事件后返回。 (更糟糕的是,使用SESSION范围的事件队列将事件发布到该用户的所有桌面(大致是浏览器选项卡) - 很可能多次执行繁重的工作。您应该使用DESKTOP scoped event queue代替。
此外,我还不完全理解为什么你不需要回调...在进行异步处理时,你总是需要某种回调或手动创建一个线程。
特别是在ZK中,在单独的线程中执行繁重的工作至关重要。检索数据后,尽可能缩短UI,以对组件树或组件模型执行更新 - 这样可以使UI尽可能地响应用户。
EventQueue用法在official docs。
中描述根据我创建的2个可运行的示例,说明simplified和generic approach。
作为替代方案,您可以直接激活/停用ZK桌面,而无需使用this (my preferred) example中的事件队列。