gpt4 book ai didi

java - GWT - onModuleLoad() 中的方法被多次调用

转载 作者:行者123 更新时间:2023-12-01 14:00:15 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的应用程序来显示图表数据。我想在用户加载页面后立即显示一些数据,因此我在 Runnable 内获取数据和绘图表,如 gwt-visualization Getting Started 中所述。 。

一切似乎都正常,只是图表往往会加载多次。下面是我的 onModuleLoad()

    private final StatisticsServiceAsync statisticsService = GWT.create(StatisticsService.class);
GWTBeanFactory factory = GWT.create(GWTBeanFactory.class);
DataTable locationData;
AnnotatedTimeLine atl;
GeoMap usMap;
TextBox storeField;
Button log10Button;
DateRange durationChartRange;
String eusrJson = null;
Button b;
HTML last1000Html;

public void onModuleLoad() {

storeField = new TextBox();
storeField.setText("Enter a store");
storeField.addKeyDownHandler(new MyKeyHandler());
b = new Button("Get Stats!");
log10Button = new Button("Show Log10 Scale");
log10Button.addClickHandler(new Log10ClickHandler());
b.addClickHandler(new MyClickHandler());

last1000Html = new HTML();
getLast1000Avg();

Runnable onLoadCallback = new Runnable() {
public void run() {
storeDurationData = DataTable.create();
storeDurationDataLog10 = DataTable.create();

RootPanel.get("storeDurationDiv").add(storeField);
RootPanel.get("storeDurationDiv").add(b);
RootPanel.get("storeDurationDiv").add(log10Button);
RootPanel.get("storeDurationDiv").add(last1000Html);

log10Button.setVisible(false);

// Get initial Data
getAvgByRegion();
getLast1000Avg();
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
getLast1000Avg();
return true;
}
}, 5000);

}
};

// Load the visualization api, passing the onLoadCallback to be called
// when loading is done.
VisualizationUtils.loadVisualizationApi(onLoadCallback, AnnotatedTimeLine.PACKAGE);
VisualizationUtils.loadVisualizationApi(onLoadCallback, GeoMap.PACKAGE);
}

所有“简单”元素似乎都已正确填充,因为 ButtonHTMLTextBox 都已正确放置(曾经位于 run 内部,由于调试了以前的错误,它们现在位于此处)。但是,GeoMap 被放置了两次,并且查看日志记录,您可以看出 Runnablerun 至少被执行了两次,这看起来很合理,但我不知道如何防止它添加两次。

我可能用异步的东西搞砸了一些东西,但我是新的并且很困惑。下面是我的 getAvgByRegion() 方法:

    private void getAvgByRegion() {
statisticsService.getEusrForRegion(new AsyncCallback<String>() {

@Override
public void onFailure(Throwable caught) {
System.out.println(":(");
}

@Override
public void onSuccess(String result) {
createLocTable();
DataTable dt = parseEusrLocations(result);
usMap = new GeoMap(dt, createGeoMapOptions());
usMap.setSize("800px", "600px");
RootPanel.get("storeDurationDiv").add(usMap);
}

});
}

欢迎就如何最好地使用 GWT 提供任何建议。

最佳答案

因此,您调用 VisualizationUtils.loadVisualizationApi 两次,因此 onLoadCallback 将运行两次(我不知道 GWT Google Apis,这是一个假设)。

onLoadCallback 调用 getAvgByRegion,这样也会被调用两次;它获取数据并在回调中创建一个新的 GeoMap 并将其添加RootPanel.get("storeDurationDiv"),这样你就得到了屏幕上有两个GeoMap

其他小部件(storeField等)仅创建一次,因此重复添加它们不是问题(性能方面除外),因为它们'在添加到新父级之前,将首先从当前父级中删除(在本例中是相同的)

关于java - GWT - onModuleLoad() 中的方法被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19388356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com