Using SimpleEventBus the following does not behave like you expect:
eventBus.addHandler(FirstEvent.TYPE, new FirstHandler() {
void onFirstEvent(FirstEvent e) {
//will be enqueued to be added. So handler is not fully registered
eventBus.addHandler(SecondEvent.TYPE, new SecondHandler() {
void onSecondEvent(SecondEvent e) {
sysout("second event")
}
}
//wont trigger handler from above
eventBus.fire(new SecondEvent());
sysout("first event done");
}
});
The output would be "first event done" and you wont see "second event" on
the console. As Thomas said handlers that you add to the event bus while an
event is actually dispatched (in this case FirstEvent) will cause the
SimpleEventBus to put the new handler into a queue. After all events are
dispatched the contents of this queue is added to the list of known
handlers ready to be executed. But as all events are already dispatched
these new handlers wont get executed.
And thats exactly what happens with your original code. Once your
DataReceiver has finished loading your data you fire an event
"OnSometimeEvent". The handler of this event calls continueStart() which in
turn adds a handler to the event bus via historyHandler.register(...) and
then fires a second event via historyHandler.handleCurrentHistory().
Because you register the history handler while your OnSometimeEvent gets
dispatched this handler will be stored in a queue in SimpleEventBus. Then
the second event will be dispatched (fired by
historyHandler.handleCurrentHistory()) and after this event has been
executed the handler in the queue will be added to the list of known
handlers.
To solve this you either have to refactor your code in a way that all
handlers are registered to the event bus before OnSometimeEvent is fired or
you have to break your code execution flow by taking the continueStart()
method and defer it until OnSometimeEvent has been dispatched.
So:
public void start() {
if(dataReady) {
Scheduler.get().scheduleFinally(
//....
continueStart();
);
} else { //wait }
}
should do the trick. If scheduleFinally does not work try scheduleDeferred
which executes the code even later. If you want to understand the Scheduler
class you should read something about the browser event loop.
-- J.
--
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/google-web-toolkit/-/9OARWz2xSVoJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-web-toolkit?hl=en.