【问题标题】:GWT - How to handle multiple handlers for the same eventGWT - 如何处理同一事件的多个处理程序
【发布时间】:2016-03-21 22:08:37
【问题描述】:

我目前正在从事一个 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

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

非常感谢!

【问题讨论】:

    标签: gwt event-handling


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多