java - GWT 中必要的解除绑定(bind)演示者

标签 java javascript gwt memory-leaks mvp

我正在按照此处给出的示例使用我的 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 时,它将自身绑定(bind)到 ViewA 中的事件。我的问题是切换到新演示者的正确方法是什么?现在,我只是创建一个新的演示者并将其附加到同一个面板,如下所示:

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

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

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

最佳答案

我建议您查看 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 对象传递给 addHandler() 方法:

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

关于java - GWT 中必要的解除绑定(bind)演示者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2626742/

相关文章:

java - 尝试将字符串数组从一个类传递到另一个类时出现 NullPointerException

java - 在Java中提取大写字符的最快方法

java - 尝试写入对象时获取 NotSerializableException

javascript - 如何从文档中获取所有图片并存储到本地

javascript - 在选中单选按钮之前禁用输入字段 (HTML)

javascript - 在 GWT 中删除 StoreFilterField 的焦点样式

java - java中通过socket传输文件的最佳方法

javascript - 更新 Chrome 浏览器上的缓存文件

java - 在客户端更改选定的 Vaadin 选项卡

java - GWT 开发和设计模式