2011-08-01 98 views
0

我知道GWT本質上是單線程的,但我試圖用延遲命令來模擬多線程效果。我試圖實現一個由isBusy布爾變量控制的文本動畫,當服務器已經響應時,文本操作(動畫效果)直接運行isBusy將獲取false值。然而,這段代碼似乎陷入了while循環?GWT多線程效應

下面是代碼:

loginButton.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      isBusy = true; // boolean 
      // Show animating effect... 
      Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
       @Override 
       public void execute() { 
        while(isBusy == true) { 
         for (int i=0;i<3;i++) { 
          if (i==0) { loginButton.setText("."); } 
          if (i==1) { loginButton.setText(".."); } 
          if (i==2) { loginButton.setText("..."); } 
         } 
        } 
       } 
      }); 
      loginService.getUser(usernameBox.getText(), passwordBox.getText(), new AsyncCallback<User>() { 
       @Override 
       public void onSuccess(User result) { 
        isBusy = false; 
       } 
       @Override 
       public void onFailure(Throwable caught) { 
        isBusy = false; 
       } 
      }); 
     } 
    }); 

回答

3

計劃是正確的工具,但使用的是錯誤的命令。您必須使用scheduleDeferred的scheduleFixedPeriod insdead。這裏有一個小例子,希望可以幫助你。

@Override 
public void onModuleLoad() { 
    final Label l = new Label(""); 
    RootPanel.get().add(l); 

    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { 

     @Override 
     public boolean execute() { 
       int i = l.getText().length(); 

       if (i == 0) { 
        l.setText("."); 
       } 
       else if (i == 1) { 
        l.setText(".."); 
       } 
       else if (i == 2) { 
        l.setText("..."); 
       } 
       else if (i == 3) { 
        l.setText(""); 
       } 
      return true; //as long as it returns true the execute is repealed after XX milliseconds 
     } 
    }, 200); 
} 
+0

它工作正常但是我在executeSuccess()和onFailure()期間將execute()返回值映射到由RPC服務設置的靜態布爾變量。我想知道爲什麼執行沒有停止。 – xybrek

+0

適用於我的情況 – Stefan