当前位置: 首页 > 知识库问答 >
问题:

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

蔚和安
2023-03-14

我正在使用我继承的大型应用程序,并且遇到了一些最佳实践问题。

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

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

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

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

共有2个答案

洪承天
2023-03-14

事件处理程序是针对EventBus内的某种集合设置和存储的独立对象实例。您的演示者只是创建它们并将它们传递给EventBus,因此在演示者的生命周期之后,处理程序仍然被引用(这就是它们继续运行的原因)。演示者可能没有被垃圾收集,因为处理程序可能仍然引用它们或它们的字段。

每当您检测到有新的presenter创建时,就会再次添加处理程序,因此解决方案是在实例化新的presenter之前清除现有的处理程序,或者跟踪它们,在已经添加新的处理程序时不添加它们。

我采用的方法是重用屏幕级视图/演示者实例,并在重新进入时重置它们的状态。这也有助于提高性能。演示者还跟踪他们添加到EventBus的所有处理程序的HandlerRegistration实例。

我不知道Colin提到的ResetableEventBus,但这听起来也是一个不错的解决方案。

房泉
2023-03-14

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

这就是GWT的活动/地点框架中的活动如何管理以防止它们泄漏。

另一个选项 - 为每个演示者提供一个类似于“stop()”或“release()”的方法,指示它是最重要的,它应该在它自己之后清理 - 取消正在进行的RPC调用,删除对话框,取消事件处理程序。如上所述,活动 API 有一种方法来指示它即将停止,并且它已停止并应进行清理。

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

 类似资料:
  • 主要内容:GWT 事件处理,事件处理程序接口,事件方法,GWT 事件处理 示例, GWT 事件处理 GWT 提供了类似于 Java AWT 或 SWING 用户界面框架的事件处理程序模型。 监听器接口定义了一个或多个小部件调用以宣布事件的方法。GWT 提供了对应于各种可能事件的接口列表。 希望接收特定类型事件的类实现关联的处理程序接口,然后将对其自身的引用传递给小部件以订阅一组事件。 例如,Button类发布点击事件,因此您必须编写一个类来实现ClickHandler来处理点击

  • 问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个

  • 问题内容: 免责声明: 此描述包含许多Qt细节。他们不是必须回答的问题,我只是想为您提供背景。 我需要在反应的。不幸的是,这不能作为信号,这就是为什么我需要subclass的原因。由于这是我唯一需要的更改,因此我想使用一个匿名子类 像这样: 这是我要用Java编写的代码,不能在c ++中编译。以下所有代码都在custom的构造函数中。将被包含在这个小部件,并应在其构造函数初始化。 奇怪的是,此代码

  • 这个问题更倾向于范式。为什么我们不在 MVP 环境中使用事件总线而不是侦听器?通常,“P”部件具有视图和模型引用的依赖关系注入。当然,这有一个优点,即通过表示器显示视图和模型之间的显式契约,这更具可读性。 但是,让演示者侦听来自视图的事件并且事件携带视图负载(例如:json表示形式)不是一种更干净的方法吗?演示者回过头来对视图说话也是如此。视图将侦听来自演示者的事件。主要优点是,我们不必为视图和表

  • 我将一些事件转发给Kafka并启动了我的Kafka流程序。我的程序开始处理事件并完成。一段时间后,我停止了我的Kafka流应用程序并重新开始。观察到我的Kafka流程序正在处理已经处理过的先前事件。 根据我的理解,Kafka流在内部维护每个应用程序id的输入主题本身的偏移量。但在这里重新处理已经处理的事件。 如何验证Kafka流处理的偏移量?Kafka流是如何保存这些书签的?根据什么 如果Kafk

  • 让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess