Развязывание ведущих необходимо в GWT


Я использую шаблон MVP из моего приложения GWT, следуя примеру, приведенному здесь http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.html

У меня есть один MainPresenter и sub-presenter для каждой из панелей в MainView. Чтобы показать новый суб-презентатор, я делаю что-то вроде этого:

presenter = new PresenterA(new ViewA(), ....);
presenter.go(panel) // presenter clears the panel and itself to the panel

Когда PresenterA создается, он связывает себя с событиями в ViewA. Мой вопрос в том, как правильно переключиться на нового ведущего? Прямо сейчас, я ... просто создайте новый презентатор и прикрепите его к той же панели следующим образом:

presenter = new PresenterB(new ViewB(), ....);
presenter.go(panel) // presenter clears the panel and itself to the panel
У меня есть некоторые сомнения относительно этого подхода. Во-первых, не вызываю ли я утечку памяти при переключении на новый ведущий? Я потерял и поле, которое ссылается на старый презентатор, и очистил его от панели, к которой он был прикреплен. Я предполагаю, что это означает, что он должен быть собран мусор, но я не совсем уверен. Во-вторых, что происходит с привязками событий, которые были у старого ведущего? Будут ли эти привязки препятствовать ведущий от того, что мусор собирают? Нужно ли мне сначала их развязать?

Как правильно обрабатывать ситуацию переключения ведущих без утечек памяти и привязки к" мертвым " событиям.

1 6

1 ответ:

Я бы предложил вам взглянуть на библиотеки gwt-mvp и/или gwt-presenter, которые используют один и тот же подход к этой проблеме. Фактически, вы создаете базовый класс для всех докладчиков, который поддерживает внутренний список всех регистраций событий, имеющихся у докладчика. Когда вы затем переходите к переключению докладчиков, вы вызываете presenter.unbind() на старом докладчике, который затем удаляет все созданные вами обработчики событий.

Базовый класс presenter будет выглядеть примерно так это:

public abstract class BasePresenter {

    private List<HandlerRegistration> registrations = Lists.newLinkedList();

    public void bind() {}

    public void unbind() {
        for(HandlerRegistration registration : registrations) {
            registration.removeHandler();
        }
        registrations.clear();
    }

    protected void addHandler(HandlerRegistration registration) {
        registrations.add(registration);
    }

}

Затем в методе bind вашего докладчика вы передаете объект HandlerRegistration в метод addHandler():

bind() {
    addHandler(foo.addBarHandler(...));
}