GWT:计时器和调度程序类

我已多次阅读此页面 ,并且我没有看到GWT的TimerScheduler类之间的一些固有差异。 我正在寻找以下各项的用例和适用性:

  • TimerTimer::scheduleTimer::scheduleRepeating
  • Scheduler::scheduleDeferred
  • Scheduler::scheduleIncremental
  • IncrementalCommand
  • DeferredCommand

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

当您需要浏览器完成其当前正在执行的任何操作之前,请使用Scheduler ,然后再告诉它执行其他操作。 例如:

 myDialogBox.show(); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { myTextBox.setFocus(); } }); 

在此示例中,在浏览器完成对话框的渲染之前,不会设置焦点,因此您告诉程序等待浏览器准备就绪。

如果您希望在指定的时间段后执行某些操作,请使用计时器 。 例如:

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

此代码将显示notificationPanel,然后它将在10秒后隐藏它。

正如JavaDoc所说, DeferredCommand已被弃用,而有利于SchedulerDeferredCommandIncrementalCommand的问题在于它们具有静态(这使得在测试中难以可靠地使用)。 而且,它们的(静态)方法会使JSNI调用强制您使用GWTTestCase来测试代码(静态方法不容易模拟)。 静态方法也使得无法将它们包装起来(例如添加一些日志记录或其他内容)。
另一方面,您使用Scheduler的实例(如果您需要可测试的代码,您将使用dependency injection来获取调度程序的实例,并且永远不会调用Scheduler.get()除非您的DI“工厂” )。 在测试中,您可以使用StubScheduler

然后是Timer ,它与其他类似,但可以取消计划任务。 请注意, Timer也使用JSNI,就像DeferredCommand一样; 任何使用Timer的代码都需要GWTTestCase进行unit testing。