Hi Phillipe.
i am going to try "ProviderBundle".
I tried to migrate my application to gwtp just before the 2.1 release but I
reverted my changes for 3 reasons :
1 - I prefer to not depend too much on an external framework. I love all new
things that come in every new release of gwt and I am afraid that frameworks
become unsupported or do not follow new features. I had the exemple of a
friend who has prefered to use GXT instead of Pure GWT, and today, he cannot
use UiBinder or the new Handler mechanism. He is still using the old
listener way.
Today, GWT has released the new Activity ~ MVP part, with their own Place
system. At the moment, MVP of GWT seems less powerfull than the GWTP's one,
but the syntax is different. And tomorrow, maybe that directions will be
more different. So I prefer not taking the risk to have a situation like
with GXT.
2 - Declaration of Presenter / View looks too much complicated to me (but it
is a pure subjective vision :) ).
All the generation of ProxyPlace are too magical for me or not enough... By
instance, The automatic generation of a Place is something interesting, but
in the same time, it is too complicated to generate. I do not like the fact
to have to declare an interface which extends ProxyPlace, and references it
in a type litteral. I would have prefered to just have something like :
@Place("login");
@RunAsync
public class LoginActivity implement GwtpActivity<LoginActivity.Presenter>
public inteface Presenter {
public void onLogin();
...
}
or something similar.
Today I prefer to stay on a manual code for this part instead of a "half
generation" that is (in my opinion) too complicated to declare.
Finally (for the code style part), I did not like the fact that we have to
use a local Widget variable in View and returns it with a asWidget() method
for UiBinder Views.
Today with GWT 2.1, all widgets implements IsWidget and provides a
asWidget(). But since we have to store a local instance of Widget inside of
view for UiBinder, it cannot be done automatically, we have to override it.
However, I understand that IsWidget was not ready when you first implemented
it. But today, it does not solve the problem of the local Widget variable.
3 - My application has two top div. One called "root" for the main part of
my application, and one called "overlay" for all elements that comes like a
filter over my root elements (to display overlay help, ...). They have both
some css declaration on them.
I did not find any way to reuse this system with GWTP. GWTP come with a
RootPresenter and I wanted to use a second RootPresenter plugged on overlay
div but it is not possible.
ActivityManager are more flexible for this, they have a setDisplay() method
to setup the top element to use.
Well, Phillipe, all those things are just my personal feelings for my
specifical needs. I think that GWTP is a great framework for a lot of
people.
Unfortunatly, in my case, I had to fight against it (maybe that it was a
design problem, but I am not sure), and there was all the more subjective
aspects (abouts framework overlay and code style) that made me go away.
In any case, Phillipe and Christian, thanks for your great work .
I am going to try ProviderBundle, maybe that I will be more comfortable with
it :)
Nicolas.
2010/11/7 PhilBeaudoin <[email protected]>
> Hi Nicolas,
>
> If you start using AsyncProvider, you might be interested in GWTP's
> ProviderBundle at some point. The problem of AsyncProvider is that it
> may introduce too many split points, and you will often want to do
> some manual optimization and group a few things together behind the
> same split point. ProviderBundle makes that really easy to do.
>
> ProviderBundle is totally usable without the rest of GWTP. (Although
> I'd love to hear your reason for not using it. ;))
>
> Cheers,
>
> Philippe
>
> On Nov 6, 4:40 pm, Nicolas Antoniazzi <[email protected]>
> wrote:
> > Thanks Thomas, I implemented something similar to what you said (I think)
> > and it works fine ! All my activities are code splitted "automatically"
> now.
> >
> > I used the AsyncProvider<T>.
> > I used a gin version compiled by gwtp team that include the AsyncProxy
> > (althouth that I do not use gwtp for severals resons, thanks to gwtp dev
> for
> > this :) ) .
> >
> > @Ashton, you can get it from here :
> http://code.google.com/p/gwt-platform/http://code.google.com/p/gwt-platform/downloads/detail?name=gin-r137.jar
> >
> > The usage of AsyncProvider<T> is very simple. It's exactly like a normal
> > Provider<T> instead that you have to give an AsyncCallback to the get()
> > method.
> > example :
> >
> > @Inject
> > Provider<MyClass> myProvider;
> >
> > @Inject
> > AsyncProvider<MyClass> myAsyncProvider;
> >
> > private MyClass instance1;
> > private MyClass instance2;
> >
> > public void myMethod() {
> > // To get an instance without code splitting
> > instance1 = myProvider.get();
> >
> > // To get an instance with code splitting
> > myAsyncProvider.get(new AsyncCallback<MyClass>() {
> > @Override
> > public void onSuccess(MyClass result) {
> > instance2 = result;
> > }
> > }
> > @Override
> > public void onFailure(Throwable caught) {
> > }
> > }
> >
> > In the previous example, instance1 is instanciated without code
> splitting,
> > instance2 with code splitting.
> > This is just a small example to show you the syntax. This example is very
> > stupid since if you declare a class with a class Provider<MyClass> in the
> > same file than an AsyncProvider<MyClass>, MyClass code will not be code
> > splitted.
> >
> > Now, just for people who would like to know how to implement an
> > ActivityAsyncProxy, my implementation looks like this : (And it might
> really
> > not be the best one. Thomas, maybe that you have a better code to share
> ;) )
> >
> > public class ActivityAsyncProxy<T> implements Activity {
> >
> > @Inject
> > private AsyncProvider<T> provider;
> > private boolean canceled = false;
> > private Activity impl;
> >
> > @Override
> > public String mayStop() {
> > if (impl != null) return impl.mayStop();
> > return null;
> >
> > }
> >
> > @Override
> > public void onCancel() {
> > if (impl != null) {
> > impl.onCancel();} else {
> > canceled = true;
> > }
> >
> > }
> >
> > @Override
> > public void onStop() {
> > if (impl != null) {
> > impl.onStop();
> > } else {
> > canceled = true;
> > }
> >
> > }
> >
> > @Override
> > public void start(final AcceptsOneWidget panel, final EventBus eventBus)
> {
> > provider.get(new AsyncCallback<T>() {
> >
> > @Override
> > public void onSuccess(T result) {
> > // Do not starts loaded activity if it has been canceled
> > if (!canceled) {
> > impl = (Activity) result;
> > impl.start(panel, eventBus);}
> >
> > }
> >
> > @Override
> > public void onFailure(Throwable caught) {
> > // TODO : send error message
> >
> > }
> > });
> > }
> > }
> >
> > Now, in my ActivityMapper :
> >
> > public class RootActivityMapper implements ActivityMapper {
> >
> > @Inject
> > Provider<ActivityAsyncProxy<LoginActivity>> loginActivityProvider;
> >
> > @Inject
> > Provider<ActivityAsyncProxy<ProfileActivity>> profileActivityProvider;
> >
> > @Inject
> > Provider<ActivityAsyncProxy<PrivacyActivity>> privacyActivityProvider;
> >
> > @Override
> > public Activity getActivity(Place place) {
> > if (place instanceof LoginPlace) return loginActivityProvider.get();
> > if (place instanceof ProfilePlace) return profileActivityProvider.get();
> > if (place instanceof PrivacyPlace) return privacyActivityProvider.get();
> >
> > return null;
> > }
> >
> > }
> >
> > And that's all.
> >
> > Well, Just for information, I created my custom provider for
> > ActivityAsyncProxy :
> >
> > public class ActivityAsyncProxyProvider<T extends Activity> implements
> > Provider<ActivityAsyncProxy<T>> {
> >
> > @Inject
> > Provider<ActivityProxy<T>> provider;
> >
> > @Override
> > public ActivityAsyncProxy<T> get() {
> > return provider.get();
> >
> > }
> > }
> >
> > Now, in my ActivityMapper, injection are less verbose :
> >
> > @Inject
> > ActivityAsyncProxyProvider<LoginActivity> loginActivityProvider;
> >
> > @Inject
> > ActivityAsyncProxyProvider<ProfileActivity> profileActivityProvider;
> >
> > @Inject
> > ActivityAsyncProxyProvider<PrivacyActivity> privacyActivityProvider;
> >
> > Thanks Thomas, you helped me a lot this week with all your tips ! :)
> >
> > Nicolas
> >
> > 2010/11/6 Ashton Thomas <[email protected]>
> >
> >
> >
> >
> >
> >
> >
> > > Does anyone have some words for implementing the AsyncProvider<T>
> > > (Still in trunk as Thomas points out)??
> >
> > > I have not see any code showing how to implement this so I am a little
> > > lost on where to start.
> >
> > > How do we need to use AsyncProvider and what else needs to be change /
> > > restructure anything?
> >
> > > Is the AsyncProvider even usable right now if we compile from source?
> >
> > > On Nov 6, 9:27 am, Thomas Broyer <[email protected]> wrote:
> > > > On 6 nov, 01:24, Nicolas Antoniazzi <[email protected]>
> > > > wrote:
> >
> > > > > Hello,
> >
> > > > > I am trying to use CodeSplitting with Activites on 2.1.
> > > > > I read this very interresting threadhttp://
> > > code.google.com/p/google-web-toolkit/issues/detail?id=5129and
> > > > > T.Broyer says that the best approach is to use an AsyncProxy for
> > > Activities.
> >
> > > > I certainly didn't say it's the best approach (just that Jarod's code
> > > > wasn't adding anything to AsyncProxy).
> >
> > > > > It makes sense but I have problem with it since my "Activities" are
> > > binded
> > > > > with Gin. AsyncProxy uses GWT.create() to instantiate the concrete
> > > types and
> > > > > all my @Inject in my Activities are thus not initialized.
> >
> > > > That's probably the reason why GIN added AsyncProvider<?>s
> > > > (unfortunately not released yet)
> >
> > > > > Does anyone tried to mix new Activity concepts with "Code
> Splitting" ?
> > > And
> > > > > do you know if it could be compatible with "Gin activities" ?
> >
> > > > I started coding the ActivityAsyncProxy I talked about in the issue
> > > > tracker (i.e. don't even call start() on the activity if it's
> > > > cancelled before being "downloaded"), but haven't yet tried it. I
> > > > think (read: I *suppose*) that for it to work with GIN, your concrete
> > > > implementations would have to use GIN's AsyncProvider, or get the
> > > > Activity from the Ginjector from within a GWT.runAsync.
> >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups
> > > "Google Web Toolkit" group.
> > > To post to this group, send email to
> [email protected].
> > > To unsubscribe from this group, send email to
> > > [email protected]<google-web-toolkit%[email protected]><google-web-toolkit%2Bunsubs
> [email protected]>
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/google-web-toolkit?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>
>
--
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
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.