2012-08-09 56 views
0

我在我的GXT项目中实现了MVP模式。系统将客户注册为其功能的一部分。系统用户也可以搜索提供该ID的注册用户。GXT自定义事件处理程序代码执行多次

我已将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弹出。然后,我退出系统并再次登录(导航到“搜索客户”按钮所在的同一页面),并且代码被执行两次。同样等于我创建/导航到特定页面的次数,代码将执行。它是否实际上添加事件处理程序代码而不删除最后一次我重新创建页面?

回答

0

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

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

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

0

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

相关问题