GXT自定义事件处理程序代码执行多次

时间:2012-08-09 06:42:33

标签: gxt

我在GXT项目中实现了MVP模式。系统将客户注册为其功能的一部分。系统用户也可以搜索提供id的注册用户。

我已将“OnClick”事件添加到“搜索客户”按钮。

/* On click search button */
        view.getBtnSearch().addListener(Events.OnClick, new Listener<BaseEvent>() {
            @Override
            public void handleEvent(BaseEvent be) {
                eventBus.fireEvent(new CustomerRegistrationTabSelectionEvent(0, false));
                eventBus.fireEvent(new CustomerFetchEvent(view.getValueCustSearchParameter(), view.getValueCustSearchValue(), true));
            }
        });

CustomerRegistrationTabSelectionEvent会选择相关选项卡并启用其他选项卡。这就是它所做的一切。

以下是自定义事件CustomerFetchEvent的处理程序。

eventBus.addHandler(CustomerFetchEvent.TYPE, new CustomerFetchEventHandler() {
            @Override
            public void fetchCustomer(CustomerFetchEvent event) {
                searchCustomer(event.getParameter(), event.getParameterValue(), event.isOpenFirstTab()); 
            }
        });

问题是搜索客户方法被多次执行,如果搜索无效,错误消息对话框会显示多个弹出窗口。在searchCustomer方法中,我调用服务来获取客户数据,或者如果搜索无效,则显示弹出错误消息。

我正在使用GXT 2.2.5和JRE 1.6。

有人可以帮我找出代码执行多次的原因吗?

后来添加: 当我第一次运行应用程序时,代码只执行一次,因此只有1个弹出窗口。然后我退出系统并再次登录(导航到存在“搜索客户”按钮的同一页面。)并且代码执行两次。同样等于我创建/导航到特定页面的次数,代码执行。是否实际添加事件处理程序代码而不是每次重新创建页面时都删除最后一个?

2 个答案:

答案 0 :(得分:0)

是的,似乎'addHandler'多次​​添加处理程序,但存储以前的上下文。您的代码应该只在初始化阶段添加一次处理程序。您可以使用'getHandlerCount'方法检查处理程序的数量。

答案 1 :(得分:0)

雅。我修好了!这是解决方案Unbinding presenters necessary in GWT

你可以在这里阅读更多内容。 http://draconianoverlord.com/2010/11/23/gwt-handlers.html

实际发生的事情是,我在HandlerManager中注册接收事件的演示者对象并未进行垃圾回收。因为虽然我删除了对演示者的引用,但HandlerManager仍然保存对这些对象的引用。所以每次我都在同一类的老主持人之上继续创建新的主持人。所以一个事件被同一个类的多个对象监听。所以你需要通过删除已注册的处理程序来确保未使用的演示者被垃圾收集 在HandlerManager中。