GWT RunAsync - странное поведение в режиме релиза - PullRequest
2 голосов
/ 13 апреля 2011

Как предлагается в этом вопросе GWT - Где я должен использовать разбиение кода при использовании мест / занятий / картографов? , я создал ActivityProxy для вложения своих действий.

Я основал свою реализацию на этом http://code.google.com/p/google-web-toolkit/issues/detail?id=5129 (6-й комментарий), с одной модификацией: я добавил проверку провайдера перед вызовом GWT.RunAsync.

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

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

Но по какой-то причине это не работает в режиме выпуска: метод onFailure никогда не вызывается, но моя активность никогда не отображается при первом его использовании. Если я перезагружаю место, все отображается нормально.

Тогда я понял, что выполнение следующего решает проблему:

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

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

Поэтому, даже если я не понимаю, почему это работает, я начал использовать его для всех своих действий.

Я снова столкнулся с проблемой, когда решил использовать генератор для моей ActivityProxy (чтобы не писать провайдера для каждой операции). Синтакс становится GWT.create(ActivityProxy).wrap(MyActivity.class);

По сути, сгенерированный код выглядит так:

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

И возникает та же проблема: мое приложение не отображает мои действия при первом их использовании.

Очень простой вопрос: «Почему?»

...