2011-01-19 4 views
3
public class MyActivity extends AbstractActivity implements ContextChangedEvent.Handler 
{ 
    public MyActivity() 
    { 
     ClientFactory.INSTANCE.getEventBus().addHandler(ContextChangedEvent.TYPE, this); 
    } 

    @override 
    public void onContextChanged() 
    { 
     //do stuff 
    } 
} 



//The getEventBus Implementation: 
public EventBus getEventBus() 
{ 
    if (eventBus == null) 
     eventBus = new ResettableEventBus(new SimpleEventBus()); 
    return eventBus; 
} 

Когда я добавить точку останова в методе onContextChange(), я получаю следующее поведение:GWT 2.1: ResettableEventBus не сбрасывается?

  • на первом месте, я разорвать только один раз для каждого события произвели
  • после того, как место изменилось, Я ломаю дважды
  • после очередной смены места, 3 раза ....

Поскольку я использую новый экземпляр MyActivity для каждого места, я думаю, что я нарушаю в нескольких экземпляров MyActivity. ResettableEventBus должен отменить регистрацию всего обработчика при каждом изменении места.

У меня пропало что-то?

ответ

3

С ResettableEventBus вам все равно придется вызывать removeHandlers (множественное число), чтобы отсоединить все. ResettableEventBus отслеживает только ваши обработчики и добавляет функцию для удаления всех обработчиков, которые были прикреплены к этому экземпляру.

Если вы используете ActivityManager и проходите в своем eventbus, ActivityManager будет обернуть ваш EventBus в ResettableEventBus и передать его вам в начале.

ActivityManager(myActivityMap, ClientFactory.INSTANCE.getEventBus()); 

... 

public class MyActivity extends AbstractActivity implements ContextChangedEvent.Handler 
{ 
    public MyActivity() 
    { 
    } 

    @override 
    public void onContextChanged() 
    { 
     // do Stuff 
    } 

    @override 
    public void start(AcceptsOneWidget panel, EventBus eventBus) { 
     eventBus.addHandler(ContextChangedEvent.TYPE, this); 
    } 
} 

Если вы используете eventBus переданного вам в «старте», ActivityManager автоматически очистит обработчики вы крепите к нему автоматически.

Также я бы предложил построить SimpleEventBus на вашем заводе вместо ResettableEventBus. В текущей версии ResettableEventBus есть ошибка, которая вызывает проблему, если вы ее вложили (Memory Leak).

http://code.google.com/p/google-web-toolkit/issues/detail?id=5700

Это больше из FYI. Также не удаляйте никаких обработчиков вручную из переданного в eventbus. Это вызвано той же ошибкой, что и выше.

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