21

我已经多次阅读此页面Timer,只是没有看到 GWT和Scheduler类之间的一些内在差异。我正在寻找以下各项的用例和适用性:

  • Timer,Timer::scheduleTimer::scheduleRepeating
  • Scheduler::scheduleDeferred
  • Scheduler::scheduleIncremental
  • IncrementalCommand
  • DeferredCommand

这些似乎或多或少都在做同样的事情,感觉就像你可以用它们完成相同的目标。这只是 GWT 提供多种方式做同一件事的方式吗?如果没有,请帮助我了解每个适当使用的时间和地点。

4

2 回答 2

35

当您需要浏览器完成它当前正在做的事情,然后再告诉它做其他事情时,请使用调度程序。例如:

myDialogBox.show();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {

    @Override
    public void execute() {
        myTextBox.setFocus();
    }
});

在这个例子中,直到浏览器完成对话框的渲染才会设置焦点,所以你告诉程序等到浏览器准备好。

如果您希望在指定时间段后发生某些操作,请使用Timer 。例如:

 notificationPanel.show();
 Timer timer = new Timer() {
     @Override
     public void run() {
         notificationPanel.hide();
     }
 };
 timer.schedule(10000);

此代码将显示通知面板,然后在 10 秒后将其隐藏。

于 2012-09-11T14:02:37.370 回答
12

正如 JavaDoc 所说,DeferredCommand不推荐使用Scheduler. DeferredCommand和的问题IncrementalCommand在于它们具有静态状态(这使得在测试中难以可靠地使用)。此外,它们的(静态)方法会进行 JSNI 调用,这会迫使您使用 aGWTTestCase来测试您的代码(静态方法不容易 - 可模拟)。静态方法也使得无法包装它们(例如添加一些日志记录或其他)。
另一方面,您使用 a 的实例(如果您想要可测试的代码,您将使用依赖注入来获取调度程序的实例,并且除了在您的 DI“工厂”中之外Scheduler永远不会调用)。Scheduler.get()在测试中,您可以使用StubScheduler例如。

然后Timer是 ,与其他类似,但可以取消计划任务。请注意,它Timer也使用 JSNI,就像DeferredCommand; 任何使用 a 的代码Timer都需要对 aGWTTestCase进行单元测试。

于 2012-09-11T12:02:43.853 回答