Развязывание предъявителей, необходимых в GWT

Я использую шаблон 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

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

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

6
задан user27478 13 April 2010 в 03:14
поделиться

1 ответ

Я бы посоветовал вам взглянуть на библиотеки 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(...));
}
6
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: