HandlerManager如何使用源代码?

时间:2012-02-07 08:34:16

标签: gwt event-bus

我已经分析了HandlerManager我不了解它如何处理事件源。第117行:

public void fireEvent(GwtEvent<?> event) {
    ...
    Object oldSource = event.getSource();
    event.overrideSource(source);
    try {

      // May throw an UmbrellaException.
      eventBus.fireEvent(event); // <--- LOOK HERE
    } catch (com.google.web.bindery.event.shared.UmbrellaException e) {
      throw new UmbrellaException(e.getCauses());
    } finally {
      ....
    }
}

但是simple event bus实现有以下代码,第86行:

@Override
public void fireEvent(Event<?> event) {
    doFire(event, null); // <---- SOURCE IS NULL???
}

@Override
public void fireEventFromSource(Event<?> event, Object source) {
    if (source == null) {
      throw new NullPointerException("Cannot fire from a null source");
    }
    doFire(event, source);
}

因此,HandlerManager 不会使用source触发事件,因为它总是调用 doFire(event,null);

你能说清楚HandlerManager如何为源代码触发事件?作为Widget中使用的HandlerManager,它如何仅为Widget实例触发事件?

1 个答案:

答案 0 :(得分:2)

如果doFire参数不是SimpleEventBus,则source中的{p> null仅更改事件的来源。

HandlerManager首先使用overrideSource设置事件的来源,然后使用隐式doFire来源调用null,这样就不会覆盖它。

QED。