Действия из gwt-платформы выполняются несколько раз

Я использую платформу gwt, objectify и appengine (java).

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

У меня есть в моем приложении, основанном на модуле Dispatch в gwt-платформе, действие входа и выход из системы.

Когда я захожу в приложение, появляется экран входа в систему, и все работает нормально. Если я перемещаюсь между докладчиками и после этого нажимаю кнопку «Выход», я вижу, что действие выхода из системы выполняется несколько раз или любое другое действие в этом отношении. Количество выполнений для действия (которое должно выполняться только один раз) кажется прямо пропорциональным количеству раз, когда я перемещаюсь между докладчиками.

Исходный код проекта размещен по адресу: http://code.google.com/p/gwt-platform-appengine-session-login-example/

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


person Berry    schedule 11.07.2012    source источник


Ответы (1)


Проблема в том, что вы добавляете обработчик событий для кнопки «Выход» в методе onReset().
Однако, если вы проверите документы GWTP, метод onReset() будет вызываться всякий раз, когда вы переходите к презентатору. Таким образом, если вы переходите к презентеру несколько раз, EventHandler будет добавлено несколько раз и, следовательно, будет выполнено несколько раз (прямо пропорционально количеству открытий презентатора).

Переместите EventHandler из метода onReset() в метод onBind(), потому что onBind() вызывается только один раз в жизненном цикле презентатора, и это место, где вы должны добавить EventHandlers. В дополнение к этому оберните его в метод registerHandler(), чтобы он автоматически удалялся при вызове onUnbind().

FirstApplicationPresenter.java:

@Override
protected void onBind() {
    super.onBind();
    getView().getLogoutBtn().setText("Logout "+username);
    registerHandler(getView().getLogoutBtn().addClickHandler(new ClickHandler() {
        @Override
            public void onClick(ClickEvent event) {
                Logout action = new Logout();
                dispatchAsync.execute(action, logoutCallback);
            }
    }));
}

@Override
protected void onReset() {
    super.onReset();
}            
person Ümit    schedule 12.07.2012
comment
Большое спасибо. Это был правильный ответ. Любая помощь приветствуется. - person Berry; 12.07.2012