0

我有一个带有单选按钮和信息标签的面板。我希望当用户单击该单选按钮时,标签将infoLabel.setText("...loading data....");,然后程序将运行一个可能需要 5 秒的长循环。当循环结束时,程序将infoLabel.setText("data was loaded");

    final RadioButton yesRadioButton=new RadioButton("confirm","Yes");
    yesRadioButton.addClickHandler(new ClickHandler(){
         @Override
         public void onClick(ClickEvent event) {
                infoLabel.setText("...loading data....");
                //long loop here
                for (int i = 0; i < cities.length; ++i) {
                    citiesOracle.add(cities[i]);}
                infoLabel.setText("data was loaded");

         }
    });

上面的代码不能正常工作。当我检查单选按钮时,程序冻结了 5 秒,然后显示标签“数据已加载”。在它运行循环之前,我没有看到标签显示“...正在加载数据...”。

所以程序在我单击单选按钮后立即运行循环并且它没有让标签有机会在显示“数据已加载”之前先显示“......正在加载数据......”

那么如何解决这个问题呢?

4

1 回答 1

1

您可以将标签设置为加载文本,然后使用 GWT 调度程序(http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/Scheduler.html

    Scheduler.get().scheduleDeferred(new ScheduledCommand() {

        @Override
        public void execute() {
             for (int i = 0; i < cities.length; ++i) {
                    citiesOracle.add(cities[i]);}
                infoLabel.setText("data was loaded");
            }
        }
    });

JavaScript(在浏览器中)是单线程的,因此您更改的标签会在点击事件后排队等待更新。使用调度程序使浏览器能够在循环之前处理标签更改。

编辑:此资源提供了一个更好的示例,如何使用调度程序执行长时间的 CPU 密集型处理,而不触发“慢速脚本”或“无响应脚本”的浏览器警报http://www.gwtproject.org/doc/latest/ DevGuideCodingBasicsDelayed.html#incremental

于 2013-08-09T19:04:58.440 回答