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

时间:2013-10-15 18:22:49

标签: java gwt gwt-visualization

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

事情似乎没有问题,除了图表往往不止一次加载。以下是我的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都已正确放置(过去曾在{{1 ,它们现在是调试先前错误的结果。)但是,run会被放置两次,并且查看日志记录,您可以判断GeoMap的{​​{1}}正在执行至少两次,这似乎是合理的,但我不是知道如何防止它添加两次。

我可能搞砸了Async的东西,但我很新并且很困惑。以下是我的Runnable方法:

run

欢迎任何关于如何最好地使用GWT的建议。

1 个答案:

答案 0 :(得分:1)

所以,你拨打VisualizationUtils.loadVisualizationApi两次,所以onLoadCallback将会运行两次(我不知道GWT Google Apis,这是一个假设)。

onLoadCallback调用getAvgByRegion,这样一个人也会被调用两次;并且它获取数据并在回调中创建新的GeoMap添加到RootPanel.get("storeDurationDiv"),因此您在屏幕上获得两个GeoMap

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