Развязывание ведущих необходимо в 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 ответ:
Я бы предложил вам взглянуть на библиотеки 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(...)); }