Пользовательский интерфейс GWT не обновляется из-за интенсивной обработки в обработчике события onChange в listBox - PullRequest
1 голос
/ 10 августа 2011

У меня есть список, на котором onChange (), я обновляю другой список.Таким образом, код выглядит примерно так:

ListBox l1 = new ListBox();
...some items added to l1..

ListBox l2 = new ListBox();
l2.setEnabled(false);

l1.addChangeHandler(new ChangeHandler() {               
    @Override
    public void onChange(ChangeEvent event) {
         //Show info msg
         //Update label text on top of the page with "Loading.."

        //..Do some processing here..

        L2.setEnabled(true);
        L2.getElement().setInnerHTML(html);
    }

Это работает нормально, за исключением одного сбоя.Пользовательский интерфейс застрял, и l1, l2 и метка не отражают изменения, пока обработка не будет завершена.Конечно, l2 будет отражаться в более поздний момент времени, но l1 и информация тоже не отображаются.

Я пытался использовать scheduleDeferred как -

l1.addChangeHandler(new ChangeHandler() {               
    @Override
    public void onChange(ChangeEvent event) {
         //Show info msg
         //Update label text on top of the page with "Loading.."

         Scheduler.get().scheduleDeferred(new ScheduledCommand() {
             @Overide
             public void execute() {
                //..Do some processing here..
            }
        }

         L2.setEnabled(true);
         L2.getElement().setInnerHTML(html);
    }
}

Но выше все равно не помогает,это все еще работает как обычно.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Вы можете взглянуть на IncrementalCommand GWT , который может помочь с долгосрочными вычислениями.

0 голосов
/ 10 августа 2011

Запланированная команда делает то же самое, что и предыдущий фрагмент - она ​​выполняет некоторую обработку, , а затем обновляет пользовательский интерфейс.то, что вам нужно сделать, это сначала обновить пользовательский интерфейс, , а затем выполнить обработку (возможно, обработка не блокирует браузер).

попробуйте это:

l1.addChangeHandler(new ChangeHandler() {               
    @Override
    public void onChange(ChangeEvent event) {
         //Show info msg
         //Update label text on top of the page with "Loading.."

         Scheduler.get().scheduleDeferred(new ScheduledCommand() {
             @Overide
             public void execute() {
                //..Do some processing here....
               performSomethingReallyExpensive();
            }
        }
        L2.setEnabled(true);
        //hopefully, this 'html' variable doesn't depend on performSomethingReallyExpensive()...
        L2.getElement().setInnerHTML(html); 
    }
}
...