正如这个问题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 使用生成器时(以避免为每个 Activity 编写提供程序),我再次遇到了这个问题。合成器变成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
}
并且出现了同样的问题:我的应用程序在第一次使用时无法显示我的活动。
这么简单的问题:“为什么?”