Как предлагается в этом вопросе 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
}
И возникает та же проблема: мое приложение не отображает мои действия при первом их использовании.
Очень простой вопрос: «Почему?»