Я использую шаблон MVP из своего приложения GWT, следующего примеру, данному здесь http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.html
У меня есть единственный MainPresenter и подпредъявитель для каждой из панелей в 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
У меня есть некоторые сомнения относительно этого подхода. Во-первых, я вызываю утечку памяти, когда я переключаюсь на нового предъявителя? Я потерял обоих поле, которое ссылается на старого предъявителя и очистило его от панели, к которой это было присоединено. Я предполагаю, что это означает, что должно быть собрано "мусор", но я не действительно уверен. Во-вторых, что происходит с привязкой события, которую имел старый предъявитель? Эта привязка будет препятствовать тому, чтобы предъявитель был собран "мусор"? Я должен развязать их сначала?
Что корректным путем является дескриптор ситуация переключающихся предъявителей без утечек памяти и связывающий с "мертвыми" событиями.
Я бы посоветовал вам взглянуть на библиотеки gwt-mvp и / или gwt-presenter , которые используют одинаковый подход к этой проблеме. Фактически, вы создаете базовый класс для всех докладчиков, который поддерживает внутренний список всех регистраций событий, которые имеет ведущий. Затем, когда вы переходите к переключению презентаторов, вы вызываете presenter.unbind ()
на старом презентаторе, который затем удаляет все созданные вами обработчики событий.
Базовый класс презентатора будет выглядеть примерно так:
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);
}
}
Затем в методе привязки вашего презентатора вы передаете объект HandlerRegistration
в метод addHandler ()
:
bind() {
addHandler(foo.addBarHandler(...));
}