2010-04-13 6 views
6

J'utilise le modèle MVP de mon application GWT suivant l'exemple donné ici http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.htmlprésentateurs entr'ouvre nécessaires GWT

J'ai un seul MainPresenter et sous-présentateur pour chacun des panneaux du MainView. Pour afficher un nouveau sous-présentateur, je fais quelque chose comme ceci:

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

Lorsque PresenterA est créé, il se lie à des événements dans le ViewA. Ma question est quelle est la bonne façon de passer à un nouveau présentateur? En ce moment, je crée simplement un nouveau présentateur et l'attacher au même groupe comme celui-ci:

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

J'ai quelques doutes au sujet de cette approche. Premièrement, est-ce que je provoque une fuite de mémoire lorsque je passe au nouveau présentateur? J'ai perdu le champ qui fait référence à l'ancien présentateur et l'ai effacé du panneau auquel il était attaché. Je suppose que cela signifie qu'il devrait être ramassé, mais je ne suis pas vraiment sûr. Deuxièmement, qu'arrive-t-il aux liaisons d'événements que l'ancien présentateur avait? Ces liens empêcheront-ils le présentateur d'être ramassé? Ai-je besoin de les délier en premier?

Quelle est la manière correcte de gérer la situation de commutation des présentateurs sans fuites de mémoire et de liaison aux événements «morts».

Répondre

6

Je suggère que vous jetez un oeil aux bibliothèques gwt-mvp et/ou gwt-presenter, qui adoptent la même approche à ce problème. En effet, vous créez une classe de base pour tous les présentateurs qui gère une liste interne de tous les enregistrements d'événements que le présentateur a. Lorsque vous venez de changer de présentateur, vous appelez le presenter.unbind() sur l'ancien présentateur, ce qui supprime tous les gestionnaires d'événements que vous avez créés.

La classe présentatrice de base ressemblera à quelque chose comme ceci:

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

} 

Ensuite, dans la méthode de liaison de votre présentateur, vous passez de l'objet HandlerRegistration dans la méthode addHandler():

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