2010-04-13 9 views
6

używam wzorca MVP z mojej aplikacji GWT następujące przykładzie podanym tutaj http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.htmlRozpinanie prezenterzy niezbędne w GWT

mam jeden MainPresenter i sub-prezentera dla każdego z paneli w MAINVIEW. Aby pokazać nową sub-prezentera, zrobić coś takiego:

presenter = new PresenterA(new ViewA(), ....); 
presenter.go(panel) // presenter clears the panel and itself to the panel 

Kiedy PresenterA jest tworzony, to wiąże sama do wydarzeń w ViewA. Moje pytanie brzmi: jaki jest właściwy sposób na przejście na nowego prezentera? Teraz, ja po prostu tworzenia nowego prezentera i dołączenie go do tego samego panelu tak:

presenter = new PresenterB(new ViewB(), ....); 
presenter.go(panel) // presenter clears the panel and itself to the panel 

mam pewne wątpliwości co do tego podejścia. Po pierwsze, czy powoduję wyciek pamięci po zmianie na nowego prezentera? Straciłem zarówno pole, które odwołuje się do starego prezentera, jak i wyczyściłem go z panelu, do którego był dołączony. Przypuszczam, że oznacza to, że powinny to być śmieci zebrane, ale nie jestem pewien. Po drugie, co się dzieje z wiązaniami zdarzeń, które miał stary prezenter? Czy te wiązania uniemożliwią prezenterowi zbieranie śmieci? Czy najpierw muszę je rozpiąć?

Jaki jest prawidłowy sposób obsługi sytuacji przełączania prezenterów bez wycieków pamięci i wiązania z "martwymi" zdarzeniami.

Odpowiedz

6

Proponuję, aby rzucić okiem na biblioteki gwt-mvp i/lub gwt-presenter, które obie mają takie samo podejście do tego problemu. W efekcie tworzysz klasę podstawową dla wszystkich prezenterów, którzy prowadzą wewnętrzną listę wszystkich rejestracji zdarzeń, które ma prezenter. Kiedy przychodzisz, aby zmienić prezenterów, zadzwoń pod numer presenter.unbind() na starego prezentera, który usunie wszystkie utworzone przez ciebie programy obsługi zdarzeń.

Podstawa klasy prezenter będzie wyglądać mniej więcej tak:

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); 
    } 

} 

Następnie w metodzie wiązania swojego prezentera, to przekazać HandlerRegistration obiektu do metody addHandler():

bind() { 
    addHandler(foo.addBarHandler(...)); 
}