【问题标题】:GWT - EventBus calling event for object that no longer existsGWT - EventBus 为不再存在的对象调用事件
【发布时间】:2013-07-11 00:16:15
【问题描述】:

我在一个大型程序中遇到了这个问题,所以我写了一个小样本来测试它。我希望有人可以向我解释这一点。

代码如下:

EventBus bus = new SimpleEventBus();

class TestClass {
    TestClass() {
        bus.addHandler(TestEvent.TYPE, new TestHandler() {

            @Override
            public void onEvent(TestEvent event) {
                System.out.println("test");
            }

        });
    }
}

class TestEvent extends GwtEvent<TestHandler> {
    public static final GwtEvent.Type<TestHandler> TYPE = new GwtEvent.Type<TestHandler>();

    @Override
    public Type<TestHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(TestHandler handler) {
        handler.onEvent(this);
    }
}

interface TestHandler extends EventHandler {
    void onEvent(TestEvent event);
}

之后我执行以下操作:

TestClass c1 = new TestClass();
c1 = new TestClass();
bus.fireEvent(new TestEvent());

现在按照我的逻辑,输出应该是一个单一的“测试”;事实上,它是两个“测试”,处理程序被调用了两次。我真的不明白为什么会这样; c1 是一个单独的对象,所以处理程序不应该只调用一次吗?

【问题讨论】:

    标签: events gwt event-bus


    【解决方案1】:

    您创建了两个TestClass 实例,通过c1 引用后者。在每次实例化期间,都会将一个匿名处理程序添加到您的单个全局总线中。因此,总线在其集合中有两个处理程序,并在您触发 TestEvent 时调用,因此有两个“测试”。

    【讨论】:

    • 当我从中删除引用时,垃圾收集器不应该清理第一个TestClass 吗?为什么会持续存在?
    • 第一个TestClass 仍然被注册到总线上的匿名TestHandler 引用,所以它不能被GC'd。 W但真正重要的是TestHandler,你永远不会将它从总线上移除,所以总线仍然知道它,它不会被GC,并且会收到事件通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多