2013-07-11 4 views
0

Я столкнулся с этой проблемой в большой программе, поэтому я написал небольшой образец, чтобы проверить его. Я надеюсь, кто-то сможет мне это объяснить.GWT - событие вызова EventBus для объекта, который больше не существует

Вот код:

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 - это единственный объект, поэтому обработчик не должен вызываться один раз?

ответ

1

Вы создали два экземпляра TestClass, ссылаясь на последний через c1. Во время каждого экземпляра анонимный обработчик был добавлен к вашей единой глобальной шине. Таким образом, есть два обработчика, которые автобус имеет в своей коллекции и звонит, когда вы стреляете TestEvent, следовательно, два «теста».

+0

Не следует ли очищать сборщик мусора первым 'TestClass', когда я удаляю ссылку из него? Почему это сохраняется? – Marconius

+1

Первый «TestClass» по-прежнему ссылается на его анонимный «TestHandler», зарегистрированный на шине, поэтому он не может быть GC'd. WBut действительно имеет значение «TestHandler», и вы никогда не удаляете его из шины, поэтому автобус все еще знает об этом, и он не будет GC'd и будет уведомлен о событиях. –

Смежные вопросы