繁体   English   中英

在GWT中需要解除绑定演示者的绑定

[英]Unbinding presenters necessary in GWT

我按照此处给出的示例使用我的GWT应用程序中的MVP模式http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.html

我为MainView中的每个面板都有一个MainPresenter和sub-presenter。 为了展示一个新的子演示者,我做了这样的事情:

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

创建PresenterA ,它会将自身绑定到ViewA中的ViewA 我的问题是,切换到新演示者的正确方法是什么? 现在,我只是创建一个新的演示者并将其附加到同一个面板,如下所示:

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

我对这种方法有些怀疑。 首先,当我切换到新的演示者时,我是否导致内存泄漏? 我丢失了引用旧演示者的字段并将其从附加到的面板中清除。 我想这意味着它应该是垃圾收集,但我不是很确定。 其次,老主持人的事件绑定会发生什么? 这些绑定是否会阻止演示者被垃圾收集? 我需要先解开它们吗?

在没有内存泄漏和绑定到“死”事件的情况下处理切换演示者的情况的正确方法是什么。

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

}

然后在演示者的bind方法中,将HandlerRegistration对象传递给HandlerRegistration addHandler()方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM