2010-04-13 10 views
6

Sto utilizzando il modello MVP dalla mia applicazione GWT seguendo l'esempio dato qui http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.htmlpresentatori non impegnativa necessarie GWT

Ho un singolo MainPresenter e sub-presentatore per ciascuno dei pannelli del MainView. Per mostrare una nuova sotto-presentatore, faccio qualcosa di simile:

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

Quando si crea PresenterA, essa si impegna a eventi nel ViewA. La mia domanda è qual è il modo corretto per passare a un nuovo presentatore? In questo momento, sto semplicemente creando un nuovo presentatore e di collegarlo alla stesso pannello come questo:

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

ho qualche dubbio su questo approccio. Per prima cosa, sto causando una perdita di memoria quando passo al nuovo presentatore? Ho perso entrambi il campo che fa riferimento al vecchio presentatore e lo ho cancellato dal pannello a cui era collegato. Suppongo che questo significhi che dovrebbe essere raccolta della spazzatura, ma non ne sono sicuro. In secondo luogo, che cosa succede alle associazioni degli eventi che il vecchio presentatore aveva? Questi legami impediranno al relatore di essere raccolto dalla spazzatura? Ho bisogno di separarli prima?

Qual è il modo corretto per gestire la situazione dei relatori senza perdite di memoria e il collegamento a eventi "morti".

risposta

6

Suggerisco di dare un'occhiata alle librerie gwt-mvp e/o gwt-presenter, che adottano entrambi lo stesso approccio a questo problema. In pratica, si crea una classe base per tutti i relatori che mantiene un elenco interno di tutte le registrazioni di eventi del presentatore. Quando poi vieni a cambiare presentatori, chiami presenter.unbind() sul vecchio presentatore, che rimuove quindi tutti i gestori di eventi che hai creato.

La base di classe presentatore sarà simile a questo:

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

} 

Poi nel metodo bind del presentatore, si passa l'oggetto del HandlerRegistration nel metodo addHandler():

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