2010-04-13 3 views
6

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

У меня есть один 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 

У меня есть некоторые сомнения по поводу такого подхода. Во-первых, я вызываю утечку памяти при переключении на новый ведущий? Я потерял и поле, которое ссылается на старого ведущего, и очистило его от панели, к которой она была прикреплена. Я полагаю, это означает, что нужно собрать мусор, но я не уверен. Во-вторых, что происходит с привязками событий, которые имел старый ведущий? Смогут ли эти привязки препятствовать тому, чтобы ведущий был собран мусором? Нужно ли сначала отпереть их?

Каков правильный способ управления ситуацией переключения презентаторов без утечек памяти и привязки к «мертвым» событиям.

ответ

6

Я предлагаю вам ознакомиться с библиотеками 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(...)); 
}