java - GWT - MVP 事件总线。创建多个处理程序

标签 java gwt mvp event-bus

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

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

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

presenter 不被变量保存,但 subview 被主视图引用。可能是 View 中的这个引用阻止了事件处理程序被删除吗?我的印象是,如果该对象被垃圾回收,事件处理程序将被删除。如果不是这种情况,我是否应该从事件总线中取消注册这些事件处理程序?

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

最佳答案

ResettableEventBus 是专门为此设计的 - 不是为 Presenter 提供全局事件总线,而是将该事件总线封装在 Resettable 版本中。然后,当该演示器关闭时,给它提供事件总线的人会重置它,从而清除它可能添加的所有处理程序。

这就是 GWT 的 Activity/Place 框架中的 Activity 是如何管理的,以防止它们泄漏。

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

同时提供这两种方法可以很容易地避免在全局事件总线上出错,并且仍然可以为更细粒度的问题(长时间运行的 RPC 调用)提供一个钩子(Hook),但是这个问题可以用任何一种解决方案来解决。

关于java - GWT - MVP 事件总线。创建多个处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754142/

相关文章:

java - 带继承的 Junit 测试是好是坏?讨论

java - 在 Android 中保存之前保留数据

image - 鼠标单击图像上的位置

java - Spring Security 和 GWT 如何集成?

vba - 为什么要在 VBA 类模块中声明新类型?

java - 没有得到 BehaviorSubject

java - YouTube视频仅在屏幕上播放音频,而在WebView Android中旋转

gwt - 使用 GWT,有没有办法不加载在 uibinder xml 文件中声明的小部件?

gwt - 如何在 Dart 中实现具有多个 View 的单页应用程序?

java - 如何在android中的MVP层之间使用注入(inject)?