Gwt HandlerManager如何处理源代码?

Gwt HandlerManager如何处理源代码?,gwt,event-bus,Gwt,Event Bus,我已经分析过了,我不知道它是如何处理事件源的。第117行: public void fireEvent(GwtEvent<?> event) { ... Object oldSource = event.getSource(); event.overrideSource(source); try { // May throw an UmbrellaException. eventBus.fireEvent(event); //

我已经分析过了,我不知道它是如何处理事件源的。第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 {
      ....
    }
}
public void firevent(GwtEvent事件){
...
Object oldSource=event.getSource();
事件。重写源(源);
试一试{
//我可以扔雨伞。
eventBus.fireEvent(事件);//事件,对象源){
if(source==null){
抛出新的NullPointerException(“无法从空源激发”);
}
doFire(事件、来源);
}
因此,HandlerManager不会使用源触发事件,因为它总是调用doFire(event,null)


您能否明确说明HandlerManager如何为源代码触发事件?由于HandlerManager在小部件中使用,它如何仅为小部件实例触发事件?

SimpleEventBus
中的doFire仅在
source
参数不为
null时更改事件的源代码

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


QED.

但是像这样填充的处理程序列表,其中源仍然为空:list handlers=getDispatchList(event.getAssociatedType(),source);它不检索event.source的处理程序,是吗?不,但是
HandlerManager
中的处理程序总是在没有
source
的情况下注册的。要清楚:
HandlerManager
从不使用
EventBus
的with source功能,而是在其
f中使用
overrideSource
强制事件的源代码IREvent
。它看起来像是专为在其创建的小部件中使用而设计的HandlerManager。我看不到强制事件源值的任何好处。过去,GWT 1.6中添加了
HandlerManager
,以支持小部件的新事件处理机制,过去是(现在仍然是)设计仅用于此目的。然后GWT 2.1添加了所有使用
EventBus
的位置、活动和RequestFactory API。最初,事件总线只是一个
HandlerManager
,但后来决定提取一个真正的
EventBus
,并在其上重写
HandlerManager
(而不是重复代码)。最后,
EventBus
通过源方法获得,这证明了使用单独的类是一个好主意。
@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);
}