GWT多线程效果

时间:2011-08-01 17:23:59

标签: gwt

我知道GWT本质上是单线程的,但是我试图用deferred命令来模拟多线程效果。我正在尝试实现一个由isBusy布尔变量控制的文本动画,当服务器响应时,文本操作(动画效果)运行unti isBusy获取false值。但是这段代码似乎陷入了while循环?

以下是代码:

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

1 个答案:

答案 0 :(得分:3)

调度程序是正确的工具,但您使用的是错误的命令。您必须使用scheduleFixedPeriod insdead of scheduleDeferred。这是一个小例子,可以帮助你。

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