[英]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.