2

在 gwt Panel.clear() 方法中清除所有子小部件。这是否意味着所有与这些子小部件关联的处理程序都将被删除或垃圾收集?

4

2 回答 2

2

是的,它会(至少如果子小部件清理了它们对像 eventBus 这样的应用程序横向对象的引用并且不持有循环引用)。

根据本文档

核心 GWT 小部件系统有一个非常具体的事件处理系统,它使得不可能触发泄漏。它也可以在 IE 中工作,只要您不直接使用 JSNI 并自己连接事件处理程序(使用 Event.sinkEvents() 之类的东西就可以了)。

除了您想停止接收事件之外,调用 Widget.removeEventListener() 或 HandlerRegistration.removeHandler()从来没有必要(或有用) (这是我们将 removeHandler() 放入 HandlerRegistration 的原因之一——大多数人从不需要叫它)。

这篇博文

但是,需要 removeHandler 以避免应用程序级别的 java 式内存泄漏。

如果你有一个“全局”事件源,比如始终可见的导航栏小部件或应用程序范围的 EventBus,并且你有一个瞬态事件监听器,比如监听事件的演示者,则演示者的事件处理程序将防止它成为垃圾收集,直到 EventBus 也被垃圾收集。

所以不要担心小部件或@UIHandler。只需清除选项卡,它就会工作。

于 2013-09-12T07:30:32.617 回答
-1

不,它不会。您必须调用removeHandler()。(最终)

这个文档中

>

2. removeHandler 是避免应用程序级内存泄漏所必需的。

如果你有一个“全局”事件源,比如始终可见的导航栏小部件或应用程序范围的 EventBus,并且你有一个瞬态事件监听器,比如监听事件的演示者,则演示者的事件处理程序将防止它成为垃圾收集,直到 EventBus 也被垃圾收集。

于 2013-09-11T19:42:57.963 回答