В GWT необходимы освобождающие докладчики - PullRequest
6 голосов
/ 13 апреля 2010

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

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

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

1 Ответ

6 голосов
/ 13 апреля 2010

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