Как правильно использовать Scheduler.get().scheduleDeferred в GWT?

Вот мой псевдокод в моем приложении GWT.

-Visible the loading Label
-Loading text from properties file (may take long)
-Invisible the loading Label & Visible the main HTMLPanel

Поэтому я хочу использовать Scheduler.get().scheduleDeferred для этого, вот код:

loadingLabel.setVisible(true);
Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
  @Override
  public void execute() {
   loadingText();
  }
}
loadingLabel.setVisible(false);
mainHTMLPanel.setVisible(true);

Но он работает неправильно, так как не показывал loadLabel, но сразу показывал mainHTMLPanel и когда я нажимаю текстовое поле внутри mainHTMLPanel, так как графический интерфейс завис, потому что он загружает текст. Затем мне нужно немного подождать, чтобы щелкнуть текстовое поле внутри mainHTMLPanel.

Но если я поставлю loadingLabel.setVisible(false); и mainHTMLPanel.setVisible(true); внутри execute(), тогда это сработает.

Но я не уверен, что это правильный путь.

Итак, является ли следующий код правильным способом использования Scheduler.get().scheduleDeferred?

    loadingLabel.setVisible(true);
    Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
      @Override
      public void execute() {
       loadingText();
       loadingLabel.setVisible(false);
       mainHTMLPanel.setVisible(true);
      }
    }

person Tum    schedule 29.10.2013    source источник
comment
Вы проверили gwtproject.org/doc/latest/DevGuideCodingBasicsDelayed.html?   -  person z00bs    schedule 29.10.2013
comment
Как реализована загрузкаText? Это вызов асинхронного метода?   -  person Fedy2    schedule 29.10.2013
comment
нет, он загружает текст из файла свойств, как будто он загружает все города мира из файла свойств   -  person Tum    schedule 29.10.2013


Ответы (1)


Используйте планировщик с «фиксированной задержкой», который будет проверять каждые 100 миллисекунд загрузки текстового содержимого. После загрузки текста скройте свой «loadingLabel» и отобразите «mainHTMLPanel».

mainHTMLPanel.setVisible(false);
loadingLabel.setVisible(true);

Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
   @Override
   public boolean execute() {
       if (isTextLoaded())  {
            loadingLabel.setVisible(false);
            mainHTMLPanel.setVisible(true);
            return false;
       }
       else {return true;}
    }
}, 100);

private boolean isTextLoaded() {
    // Dummy check
    MyWidgetContainingText.getContent().isNotEmpty();
}
person otonglet    schedule 29.10.2013
comment
тогда мне нужно проверить, когда все данные были загружены, есть ли другой способ - person Tum; 29.10.2013
comment
Рассмотрим следующее: если вы не проверите, как вы узнаете, загружен ли текст? И если вы не знаете, загружена ли она, как вы можете решить отображать HTMLPanel или нет? Если ваша цель — отобразить элемент только после того, как его содержимое будет готово, думаю, мой ответ вам подойдет. Не могли бы вы подробнее рассказать о том, что вам в нем не нравится? - person otonglet; 29.10.2013
comment
дело в том, что я не хочу делать saperated метод isTextLoaded(). Я пытался использовать ваш метод, но обходился без метода isTextLoaded, и почему-то он не работает, он не показывает метку загрузки - person Tum; 29.10.2013
comment
1° Вам не нужно писать отдельный метод. Если вы хотите разместить все в одном месте, просто поставьте галочку в условии if. 2° Метка загрузки отображается СНАРУЖИ вызова планировщика и скрыта ВНУТРИ вызова планировщика. Если метка загрузки не отображается, либо вы не отображали ее перед вызовом, либо текст загружается так быстро, что вы даже не можете его увидеть, прежде чем он будет скрыт. Если вы не напишете правильное условие if, оно, конечно же, выполнит loadingLabel.setVisible(false). - person otonglet; 29.10.2013
comment
Я использовал вашу технику, но она все равно не показывала loadingLabel. Я нашел способ, то есть я поместил loadingText () внутри Timer и позволил ему запуститься через 2 секунды, затем на этот раз появился loadingLabel. Это правильный способ сделать? - person Tum; 30.10.2013
comment
Конечно, вы можете, если это единственный способ заставить вас работать. Имейте в виду, что это не очень чисто, так как вы можете заставить пользователя ждать 2000 миллисекунд, когда 200 достаточно. Я думаю, что причина, по которой loadLabel не отображается с использованием моего метода, заключается в том, что тест if неверен. Не могли бы вы опубликовать код, чтобы объяснить, как вы понимаете, что текст загружен? - person otonglet; 30.10.2013
comment
очень простой цикл. это MultiWordSuggestOracle. Это цикл для (int i=0; i‹countries.length; i++) { mySuggestOracles.add(countries[i]); } - person Tum; 30.10.2013
comment
хорошо, как вы сообщаете планировщику, что текст загружается, когда вы находитесь в конце цикла? - person otonglet; 30.10.2013
comment
это мой код: loadingLabel.setVisible(true); Timer t = new Timer() { @Override public void run() { loadingText(); mainHTMLPanel.setVisible (истина); } }; т.расписание(200); пусть код внутри таймера запустится через 200 миллисекунд - person Tum; 30.10.2013
comment
Я думал, что метод loadingText() требует много времени для выполнения, но вы вызываете его внутри таймера. Я потерялся, и я закончил. Удачи с вашей проблемой! - person otonglet; 30.10.2013
comment
В любом случае, спасибо, я доволен решением Timer - person Tum; 30.10.2013