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

时间:2016-03-21 12:11:25

标签: gwt event-handling

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

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

所以我想到的解决方案是在我们离开它时从页面中删除处理程序,这样只有一个页面同时有一个注册处理程序来执行相同的操作按钮事件。

首先,我注册操作按钮单击事件并保存从addHandler方法返回的HandlerRegistration对象:

HandlerRegistration actionButtonClickEventHandlerRegistration=eventBus.addHandler(CommonBlockActionButtonClickedEvent.TYPE, someHandler);

然后,在页面更改事件中,我从先前保存的HandlerRegistration对象中调用removeHandler

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

所以我在每个页面都这样做,除了当我浏览我的应用程序并转到其中两个页面时,我收到此错误:

Caused by: java.lang.AssertionError: redundant remove call

你们是否知道为什么我会收到此错误或其他方式来解决我的问题?

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

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

尽管如此,您似乎至少删除了两次处理程序,并且应该检查您的程序逻辑。

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