开发者

GWT RunAsync - Strange behavior in release mode

开发者 https://www.devze.com 2023-02-25 00:58 出处:网络
As suggested in this question GWT - Where should i use code splitting while using places/activities/mappers?, I created an ActivityProxy to nest my activities.

As suggested in this question GWT - Where should i use code splitting while using places/activities/mappers?, I created an ActivityProxy to nest my activities.

I based my implementation on this http://code.google.com/p/google-web-toolkit/issues/detail?id=5129 (6th comment), with one modification: I added a check on the provider before calling GWT.RunAsync:

if (provider != null)
{
    GWT.runAsync(new RunAsyncCallback()
    {
        @Override
        public void onFailure(Throwable reason)
        {
            // ...
        }

        @Override
        public void onSuccess()
        {
            ActivityProxy.this.nestedActivity = provider.create();
            //...
        }
    });
}

But for some reason, this doesn't work in release mode: the onFailure methode is never called but my activity is never displayed the first time I use it. If I reload the place, everything display just fine.

Then I realised that doing the following solves the problem:

GWT.runAsync(new RunAsyncCallback()
{
    @Override
    public void onFailure(Throwable reason)
    {
        // ...
    }

    @Override
    public void onSuccess()
    {
        if (provider != null)
        {
            ActivityProxy.this.nestedActivity = provider.create();
            //...
        }
    }
});

So even if I don't understand why it works, I started using it for all my activities.

I ran into the problem again when I decided to use a generator for my ActivityProxy (to avoid writing a provider for each Activity). The synthax becomes GWT.create(ActivityProxy).wrap(MyActivity.class);

Basically, the generated code looks like this:

if (clazz.getName() == "FooClass")
{
    nestedActivity = new FooClass(); //inside a RunAsync
}
if (clazz.getName() == "BarClass")
{
    nestedActivity = new BarClass(); //inside a RunAsync
}

And the same problem occurs: my app fails to display my activitie开发者_JS百科s the first time they are used.

So simple question : "Why?"

0

精彩评论

暂无评论...
验证码 换一张
取 消