gwt - 事件处理程序不会被删除

标签 gwt gwt-mvp

我正在努力加快使用 GWT 事件和地点的速度。我正在使用最初在这个好 blog post 上找到的一些源代码进行测试.

我发现在 bind() 期间添加的处理程序似乎从未被删除。我对Activity javadoc的一点理解让我认为它们应该在调用 Activity 的 onStop() 方法时自动删除。

All event handlers it registered will have been removed before this method is called.

但每次我单击一个按钮时,相应的处理程序都会被调用 n+1 次。

我错过了什么?如果我可以提供更多信息,请告诉我。

这是代码中的相关片段:

public class ContactsActivity extends AbstractActivity {

private List<ContactDetails> contactDetails;
private final ContactsServiceAsync rpcService;
private final EventBus eventBus;
private final IContactsViewDisplay display;
private PlaceController placeController;

public interface IContactsViewDisplay {
    HasClickHandlers getAddButton();
    HasClickHandlers getDeleteButton();
    HasClickHandlers getList();
    void setData(List<String> data);
    int getClickedRow(ClickEvent event);
    List<Integer> getSelectedRows();
    Widget asWidget();
}

public ContactsActivity(ClientFactory factory) {
    GWT.log("ContactActivity: constructor");

    this.rpcService = factory.getContactServiceRPC();
    this.eventBus = factory.getEventBus();
    this.display = factory.getContactsView();
    this.placeController = factory.getPlaceController();
}

@Override
public void start(AcceptsOneWidget container, EventBus eventBus) {
    GWT.log("ContactActivity: start()");

    bind();
    container.setWidget(display.asWidget());
    fetchContactDetails();

}

public void bind() {

    GWT.log("ContactActivity: bind()");

    display.getAddButton().addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            GWT.log("Add button clicked");
            ContactsActivity.this.placeController.goTo(new NewContactPlace(""));
        }
    });

    display.getDeleteButton().addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            GWT.log("ContactActivity: Delete button clicked");
            deleteSelectedContacts();
        }
    });

    display.getList().addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            GWT.log("ContactActivity: List clicked");
            int selectedRow = display.getClickedRow(event);

            if (selectedRow >= 0) {
                String id = contactDetails.get(selectedRow).getId();
                ContactsActivity.this.placeController.goTo(new EditContactPlace(id));
            }
        }
    });
}

最佳答案

事件注册通过。传递给 AbstractActivity#start()EventBus 将在调用 onStop() 时注销。但是,在上述 bind() 方法中注册的事件处理程序并未通过 EventBus 注册,并且对抽象基类不可见。您需要自己注销它们:

public class ContactsActivity extends AbstractActivity {
  private List<HandlerRegistration> registrations = new ArrayList();

  private void bind() {
    registrations.add(display.getAddButton().
      addClickHandler(new ClickHandler() { ... }));
    registrations.add(display.getDeleteButton().
      addClickHandler(new ClickHandler() { ... }));
    registrations.add(display.getList().
      addClickHandler(new ClickHandler() { ... }));
  }

  @Override
  public void onStop() {
    for (HandlerRegistration registration : registrations) {
      registration.removeHandler();
    }

    registrations.clear();
  }
}

关于gwt - 事件处理程序不会被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973323/

相关文章:

java - 从 PHP 到哪里去?

java - 摆脱 GWT MVP 样板

gwt - 消除 GWT ActivityMapper 样板

gwt - 如何使用 GWT 内置 MVP 框架仅更改一个小部件并让其他小部件保持不变?

java - GWT MVP 历史 回来

java - GWT CellTable/DataGrid - 如何检测列选择?

java - 如何使用 GWT 2.4 在服务器端动态创建 UI

java - GWT,元素, worker : null instance

java - GWT 任意 HTML

GWT MVP - 维护多个相互独立的显示器