簡體   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