(Using version 2.5.0)
I am a bit surprised the way gwt decide to include code in a split point, or left over.
Example: creation of a controller in a split point. (without the -XfragmentCount option)
1) Safe way that always works: create controller in an anonymous RunAsyncCallback.onSuccess() method:
----
public void createSomeController(final AsyncCallback<MemberLoonController> callback, final Bla args) {
final RunAsyncCallback async = new RunAsyncCallback() {
public void onSuccess() {
callback.onSuccess(new SomeControllerDefault(args));
}
public void onFailure(Throwable ex) {
callback.onFailure(ex);
}
};
GWT.runAsync(async);
}
----
The above gives the same result when not creating the async variable but passing the RunAsyncCallback directly to the GWT.runAsync() method. Which might sound logic, but nothing is like it seems...
Above results in my case in (Soyc report):
Total code size: 1.1 MB
Initial size: 350 KB
left over: 550 KB
2) However when I replace the above line "GWT.runAsync(async)" by the following:
---
if (GWT.isScript()) {
GWT.runAsync(async);
}
else {
new CommandDeferred() { public void execute() {
GWT.runAsync(callback);
}
----
I do the above because I want the runAsync to be run decoupled when running in dev mode to get the exact same behavior as in script mode. This is due to an open issue (bug) that hasn't been solved yet, that is: in dev mode the behavior is different as it's not decoupled that can lead to strange app bugs..
Anyway: the point here is: that it will always run the "GWT.runAsync(async);" command just like above but then through an if statement...
Surprisingly however, the above results in a much bigger left over:
---
Total code size: 1.1 MB
Initial size: 350 KB
left over: 750 KB
---
Interesting, so the GWT compiler doesn't use the runtime dependency path like you would expect...
BTW: this is a bumper so that I can never use this construction, such that my behavior in web and dev mode are (too) different... (mentioned above)
This is just one of the tests that was I was surprised of.
I another test I did:
3) Just like 1) but pass in a Creator method, like this:
---
public void createSomeController(final AsyncCallback<SomeController> callback, final CreatorSimple<SomeController> creator) {
final RunAsyncCallback async = new RunAsyncCallback() {
public void onSuccess() {
callback.onSuccess(creator.create());
}
public void onFailure(Throwable ex) {
callback.onFailure(ex);
}
};
GWT.runAsync(async);
}
---
I call the above code like this for example (the above usage makes it nice to share split points in case it works anyway):
---
final CreatorSimple<SomeController> creator = new CreatorSimple<SomeController>() {
public SomeController create() {
return new SomeControllerDefault(args);
}
};
getLazyLoader().createLoonController(callback, creator);
---
Also this results in the same big left over :(..
I am surprised about this as the creation of the controller is only called through the GWT.runAsync() and NEVER through another piece of code...
So why is my left over so big? Why is GWT deciding it's not included in it's own split point?
I don't understand the difference with construction 1), as besides it's another construction, it leads to the same result you would expect
I tried more constructions like putting the controller creation in it's own class instead of through an anonymous class, but it all results to the same big left over...
Idea's, your experience ?
My experience/advice: always use the less flexible construction 1) which makes it difficult to share split points and workaround the dev-mode-script-mode (bug) difference.. But at least that results in "correct" split points...
- Ed