2010-04-13 23 views
6

estoy usando el patrón MVP de mi aplicación GWT siguiendo el ejemplo dado aquí http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.htmlpresentadores compromiso.Por necesarias en GWT

que tienen un solo MainPresenter y sub-presentador para cada uno de los paneles de la MainView. Para mostrar un nuevo sub-presentador, hago algo como esto:

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

Cuando se crea PresenterA, que se obliga a los acontecimientos en el ViewA. Mi pregunta es ¿cuál es la forma correcta de cambiar a un nuevo presentador? En este momento, estoy simplemente creando un nuevo presentador y lo conecta con el mismo panel de la siguiente manera:

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

tengo algunas dudas sobre este enfoque. En primer lugar, ¿estoy causando una pérdida de memoria cuando cambio al nuevo presentador? Perdí el campo que hace referencia al viejo presentador y lo borré del panel al que estaba adjunto. Supongo que esto significa que debería ser basura, pero no estoy seguro. En segundo lugar, ¿qué sucede con las vinculaciones de eventos que tenía el presentador anterior? ¿Estas fijaciones evitarán que el presentador sea recogido basura? ¿Debo desvincularlos primero?

¿Cuál es la forma correcta en que se maneja la situación del cambio de presentadores sin pérdida de memoria y vinculación a eventos "muertos"?

Respuesta

6

Sugiero que eche un vistazo a las bibliotecas gwt-mvp y/o gwt-presenter, que ambas adoptan el mismo enfoque para este problema. Efectivamente, crea una clase base para todos los presentadores que mantiene una lista interna de todos los registros de eventos que tiene el presentador. Cuando se trata de cambiar de presentador, llama al presenter.unbind() en el presentador anterior, que luego elimina todos los controladores de eventos que ha creado.

clase presentador

La base se verá algo como esto:

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

} 

Luego, en el método de enlace de su presentador, se pasa el objeto de HandlerRegistration en el addHandler() método:

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