GWT 2.1: ResettableEventBus не сбрасывается? - PullRequest
3 голосов
/ 19 января 2011
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 (), я получаю следующее поведение:

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

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

Я что-то упустил?

1 Ответ

3 голосов
/ 20 января 2011

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

Если вы используете ActivityManager и передаете свою шину событий, 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, переданный вам в «start», ActivityManager автоматически очистит обработчики, которые вы к нему подключили, автоматически.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...