Cputerace
24 Apr 2009, 7:43 AM
Below is the fireEvent code for BaseObservable:
public boolean fireEvent(int eventType, BaseEvent be) {
if (firesEvents && listeners != null) {
activeEvent = true;
be.type = eventType;
be.source = be.source;
List<Listener> list = listeners.get(eventType);
if (list != null) {
for (Listener l : list) {
l.handleEvent(be);
}
}
activeEvent = false;
return be.doit;
}
return true;
}
In this section:
List<Listener> list = listeners.get(eventType);
if (list != null) {
for (Listener l : list) {
l.handleEvent(be);
}
}
the checkforcomodification exception at the bottom of the post is occurring within our code. This will happen whenever you add a listener to a baseObservable for an event during handleEvent() for that event. What you should do with this above code is something like this:
List<Listener> list = listeners.get(eventType);
if (list != null && list.size > 0) {
ArrayList<Listener> clonelist = new ArrayList<Listener>();
for (Listener l : listeners.get(eventType))
clonelist.add(l);
for (Listener l : clonelist) {
l.handleEvent(be);
}
}
this way you are making a shallow clone of the list immediately(no possibility of checkForComodification), then iterating through that shallow list (which will never change, even if listeners are added, therefore no checkForComodification) to dispatch events.
java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
java.util.AbstractList$Itr.next(AbstractList.java:343)
com.extjs.gxt.ui.client.event.BaseObservable.fireEvent(BaseObservable.java:73)
com.extjs.gxt.ui.client.widget.Component.fireEvent(Component.java:440)
com.extjs.gxt.ui.client.widget.Component.onBrowserEvent(Component.java:686)
com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308)
com.google.gwt.user.client.DOM.dispatchEventAndCatch(DOM.java:1287)
com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1255)
sun.reflect.GeneratedMethodAccessor114.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
com.google.gwt.dev.shell.ie.IDispatchImpl.callMethod(IDispatchImpl.java:126)
com.google.gwt.dev.shell.ie.IDispatchProxy.invoke(IDispatchProxy.java:155)
com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:294)
com.google.gwt.dev.shell.ie.IDispatchImpl.method6(IDispatchImpl.java:194)
org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:117)
org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1925)
org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
com.google.gwt.dev.GWTShell.pumpEventLoop(GWTShell.java:720)
com.google.gwt.dev.GWTShell.run(GWTShell.java:593)
com.google.gwt.dev.GWTShell.main(GWTShell.java:357)
public boolean fireEvent(int eventType, BaseEvent be) {
if (firesEvents && listeners != null) {
activeEvent = true;
be.type = eventType;
be.source = be.source;
List<Listener> list = listeners.get(eventType);
if (list != null) {
for (Listener l : list) {
l.handleEvent(be);
}
}
activeEvent = false;
return be.doit;
}
return true;
}
In this section:
List<Listener> list = listeners.get(eventType);
if (list != null) {
for (Listener l : list) {
l.handleEvent(be);
}
}
the checkforcomodification exception at the bottom of the post is occurring within our code. This will happen whenever you add a listener to a baseObservable for an event during handleEvent() for that event. What you should do with this above code is something like this:
List<Listener> list = listeners.get(eventType);
if (list != null && list.size > 0) {
ArrayList<Listener> clonelist = new ArrayList<Listener>();
for (Listener l : listeners.get(eventType))
clonelist.add(l);
for (Listener l : clonelist) {
l.handleEvent(be);
}
}
this way you are making a shallow clone of the list immediately(no possibility of checkForComodification), then iterating through that shallow list (which will never change, even if listeners are added, therefore no checkForComodification) to dispatch events.
java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
java.util.AbstractList$Itr.next(AbstractList.java:343)
com.extjs.gxt.ui.client.event.BaseObservable.fireEvent(BaseObservable.java:73)
com.extjs.gxt.ui.client.widget.Component.fireEvent(Component.java:440)
com.extjs.gxt.ui.client.widget.Component.onBrowserEvent(Component.java:686)
com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308)
com.google.gwt.user.client.DOM.dispatchEventAndCatch(DOM.java:1287)
com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1255)
sun.reflect.GeneratedMethodAccessor114.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
com.google.gwt.dev.shell.ie.IDispatchImpl.callMethod(IDispatchImpl.java:126)
com.google.gwt.dev.shell.ie.IDispatchProxy.invoke(IDispatchProxy.java:155)
com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:294)
com.google.gwt.dev.shell.ie.IDispatchImpl.method6(IDispatchImpl.java:194)
org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:117)
org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1925)
org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
com.google.gwt.dev.GWTShell.pumpEventLoop(GWTShell.java:720)
com.google.gwt.dev.GWTShell.run(GWTShell.java:593)
com.google.gwt.dev.GWTShell.main(GWTShell.java:357)