2013-10-15 98 views
0

我正試圖編寫一個簡單的應用程序來顯示圖表數據。我想在用戶加載頁面後立即顯示一些數據,因此我正在獲取Runnable中的數據&繪圖表,如gwt-visualization Getting Started中所述。GWT - 多次調用onModuleLoad()中的方法

事情似乎工作正常,除了圖表往往會加載不止一次。以下是我的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); 
} 

所有的「簡單」的元素似乎得到正確填充,作爲ButtonHTML,並TextBox都得到適當的(這曾經是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合作任何意見是值得歡迎的。

回答

1

所以,你打電話VisualizationUtils.loadVisualizationApi兩次,所以onLoadCallback將運行兩次(我不知道GWT谷歌Apis,這是一個假設)。

onLoadCallback調用getAvgByRegion,這樣一個人也會被調用兩次;並獲取數據並在回調中創建新的GeoMap添加到RootPanel.get("storeDurationDiv"),因此您在屏幕上獲得兩個GeoMap s。

的其他部件(storeField等)創建一次,所以add反覆荷蘭國際集團他們是沒有問題的(除了性能明智),因爲他們會首先從當前父在加入之前去除新的(在這種情況下是相同的)

+0

你擊中了頭部。以前,當我沒有加載GeoMap可視化API時,它抱怨說,所以我繼續按照上面的方法做。然而,正如你所建議的,這導致它加載兩次。從谷歌的例子來看,「VisualizationUtils.loadVisualizationApi」支持可變參數並不是顯而易見的。我改變了我的負載到'VisualizationUtils.loadVisualizationApi(onLoadCallback,AnnotatedTimeLine.PACKAGE,GeoMap.PACKAGE);'它的工作就像一個魅力。 – lase