GWT-如何处理同一事件的多个处理程序

GWT-如何处理同一事件的多个处理程序,gwt,event-handling,Gwt,Event Handling,我目前正在从事一个GWT项目。我在多个页面之间共享了一个公共块。我在那个公共块上有一些操作按钮,页面上有一个处理程序,用于单击这些操作按钮时启动的事件 我面临的问题是,当我单击A页上的其中一个操作按钮时,也会调用先前注册的B页上的处理程序 因此,我想到的解决方案是在离开页面时将处理程序从页面中删除,这样一次只有一个页面具有同一个操作按钮事件的已注册处理程序 首先,我注册到action button click events并保存从addHandler方法返回的HandlerRegistratio

我目前正在从事一个GWT项目。我在多个页面之间共享了一个公共块。我在那个公共块上有一些操作按钮,页面上有一个处理程序,用于单击这些操作按钮时启动的事件

我面临的问题是,当我单击A页上的其中一个操作按钮时,也会调用先前注册的B页上的处理程序

因此,我想到的解决方案是在离开页面时将处理程序从页面中删除,这样一次只有一个页面具有同一个操作按钮事件的已注册处理程序

首先,我注册到action button click events并保存从addHandler方法返回的HandlerRegistration对象:

HandlerRegistration actionButtonClickEventHandlerRegistration=eventBus.addHandler(CommonBlockActionButtonClickedEvent.TYPE, someHandler); 因此,我在每个页面上都会这样做,但当我启动应用程序并转到其中两个页面时,会出现以下错误:

Caused by: java.lang.AssertionError: redundant remove call
你们知道我为什么会犯这样的错误,或者用其他方法来解决我的问题吗


非常感谢

删除处理程序后,我会将其设置为null,并在删除它之前检查它是否实际为null。 像这样:

eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() {
    @Override
    public void onMainPageChange(PageChangeEvent event) {
        if(actionButtonClickEventHandlerRegistration != null ) {
            actionButtonClickEventHandlerRegistration.removeHandler();
            actionButtonClickEventHandlerRegistration = null;
        }
    }
});
尽管如此,您似乎至少删除了两次处理程序,并且应该检查您的程序逻辑

一种很好的方法是在删除处理程序的行上的调试器(浏览器)中设置断点。如果查看每个调用的调用堆栈,您应该能够发现重复调用并修复它

eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() {
    @Override
    public void onMainPageChange(PageChangeEvent event) {
        if(actionButtonClickEventHandlerRegistration != null ) {
            actionButtonClickEventHandlerRegistration.removeHandler();
            actionButtonClickEventHandlerRegistration = null;
        }
    }
});