2011-08-10 2 views
1

onChange()에서 다른 listBox를 업데이트하는 목록 상자가 있습니다. 그래서 코드는이 하나의 결함을 제외한 모든 잘 작동한다listBox의 onChange 이벤트 처리기에서 많은 처리로 인해 GWT UI가 업데이트되지 않습니다.

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); 
    } 

같은 것입니다. UI가 멈추고 l1, l2 및 label은 처리가 완료 될 때까지 변경 사항을 반영하지 않습니다. l2는 나중 시점에 반영되지만, l1과 정보도 나타나지 않습니다.

나는대로 scheduledDeferred를 사용하여 시도 -

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); 
    } 
} 

그러나 위의 여전히 도움이되지 않으며, 여전히 평소처럼 일하고있다. 어떤 제안?

답변

0

예약 된 명령은 이전 스 니펫과 정확히 동일합니다. 일부 처리를 수행하면 이 표시되고은 UI를 업데이트합니다. 당신이해야 할 일은 먼저 처리를 수행하는 UI를 업데이 트하는 것입니다 (처리가 브라우저를 잠그지 않는 것이 좋을 것입니다).

이 시도 :

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); 
    } 
} 
+0

죄송합니다. 나는 복사 - 붙여 넣기하는 동안 그것을 잘못 썼다. 나는 당신이 말하는 것을 수행하고 있습니다. 즉, scheduleDeferred에서 처리하고 있습니다. 그리고이 외부에서는 UI를 업데이트했습니다. 어떤 것도 작동하지 않습니다. BTW, 내 처리 과정에서 기어 데이터베이스를 쿼리하고 있습니다. 쿼리는 SQLite에 약간 무겁기 때문에 시간이 걸립니다. 귀하의 회신에 감사 드리며 원래 질문을 수정하겠습니다. – Rahul

+0

그렇다면 UI 업데이트가 실행되는지 (즉, 값 비싼 sqlite 호출로 인해 브라우저가 지연하는지) 확인할 수 있습니다. - Scheduler.get() 호출 사이에 GWT.log()를 삽입하십시오. .. 그리고 L2.setEnabled() ... – Chii

+0

나는 쿼리를 빠르게 (SQLite에 인덱스를 추가 한)이 다른 방법으로 해결 했으므로 신속하게 반환됩니다. – Rahul

0

당신은 장기 실행 계산에 도움을 줄 수 GWT의 IncrementalCommand로 볼 수 있었다.

관련 문제