2013-10-15 6 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); 
} 

Все «простых» элементов, кажется, чтобы получить заселена правильно, как Button, HTML и TextBox все объекты помещаются надлежащим образом (который имел обыкновение быть внутри run, они, где они находятся в настоящее время в качестве результат отладки предыдущих ошибок). Тем не менее, GeoMap получает два раза, и, глядя на регистрацию, вы можете сказать, что Runnablerun выполняется как минимум дважды, что кажется разумным, но я не знаю, как удержать его от добавления дважды.

Я, вероятно, что-то напугаю с помощью материала Async, но я новичок и смущен. Ниже мой 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 Google Apis, это предположение).

onLoadCallback звонит getAvgByRegion, так что вы также получите вызов дважды; и он получает данные, а в обратном вызове создает новые GeoMap и добавляет к RootPanel.get("storeDurationDiv"), поэтому вы получаете на экране два изображения GeoMap.

Другие виджеты (storeField и т. Д.) Создаются только один раз, поэтому их неоднократно не проблема (кроме производительности), поскольку они сначала будут удалены из их текущего родителя, прежде чем будут добавлены в новый (который в этом случае тот же)

+0

Вы ударите ноготь по голове. Раньше он жаловался, когда я не загружал API визуализации GeoMap, поэтому я пошел дальше и сделал это, как указано выше. Однако, как вы предположили, это вызывало нагрузку в два раза. Исходя из примера Google, не сразу видно, что «VisualizationUtils.loadVisualizationApi» поддерживает варгары. Я изменил свой груз на «VisualizationUtils.loadVisualizationApi (onLoadCallback, AnnotatedTimeLine.PACKAGE, GeoMap.PACKAGE)», и он работает как шарм. – lase

Смежные вопросы