GWT - MVP事件总线.多个处理程序被创建

agl*_*man 3 java mvp gwt event-bus

我在一个我继承的大型应用程序中工作,并且遇到了一些最佳实践问题.

每次用户导航到"我们的客户编辑"页面时,都会创建一个新的演示者,并设置一个视图.有一个主要的客户编辑演示者和一个主视图.主视图中还有子视图,由主演示者的子演示者使用.在子演示者中,我在事件总线上注册事件处理程序.

我遇到的问题是,当第二次导航到联系人编辑器时,会再次创建演示者,并再次注册这些事件.现在,当一个事件发生时,它会被处理两次,每个presenter实例一次.

演示者不会被变量保留,但子视图由主视图引用.可能是视图中的这个引用是否阻止事件处理程序被删除?我的印象是,如果该对象被垃圾收集,将删除事件处理程序.如果不是这种情况,我应该从事件总线取消注册这些事件处理程序吗?

更新:演示者没有被垃圾收集.如果我可以修改代码以在不再需要它们时删除对这些演示者的所有引用,它们是否会被收集,因此将删除事件处理程序?

Col*_*rth 5

ResettableEventBus是专门为此而设计的 - 您不必为Presenter提供全局事件总线,而是将该事件总线包装在Resettable版本中.然后,当该演示者关闭时,无论谁给它该事件总线重置它,从而清理它可能已添加的所有处理程序.

这就是如何管理GWT活动/场所框架中的活动以防止它们泄露.

另一种选择 - 为每个Presenter提供一个方法,如'stop()'或'release()',表明它是最重要的,它应该自行消除 - 取消正在进行的RPC调用,删除对话框,取消事件处理程序.如上所述,Activity api有一个方法来指示它即将停止,并且它已经停止并且应该清理.

提供这两种方法可以很容易地避免使用全局事件总线出错,并且仍然可以解决更细粒度的问题(长时间运行的RPC调用),但问题可以通过任一解决方案解决.