代码之家  ›  专栏  ›  技术社区  ›  gerdemb

在GWT中需要解绑演示者

  •  6
  • gerdemb  · 技术社区  · 15 年前

    我使用的是我的GWT应用程序中的MVP模式,如下所示 http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.html

    对于主视图中的每个面板,我都有一个主演示者和子演示者。要显示新的子演示者,我执行如下操作:

    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 回复  |  直到 15 年前
        1
  •  6
  •   Jared Russell    15 年前

    我建议你看看 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(...));
    }