GWT:计时器和调度程序类
我已多次阅读此页面 ,并且我没有看到GWT的Timer
和Scheduler
类之间的一些固有差异。 我正在寻找以下各项的用例和适用性:
-
Timer
,Timer::schedule
和Timer::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
已被弃用,而有利于Scheduler
。 DeferredCommand
和IncrementalCommand
的问题在于它们具有静态(这使得在测试中难以可靠地使用)。 而且,它们的(静态)方法会使JSNI调用强制您使用GWTTestCase
来测试代码(静态方法不容易模拟)。 静态方法也使得无法将它们包装起来(例如添加一些日志记录或其他内容)。
另一方面,您使用Scheduler
的实例(如果您需要可测试的代码,您将使用dependency injection来获取调度程序的实例,并且永远不会调用Scheduler.get()
除非您的DI“工厂” )。 在测试中,您可以使用StubScheduler
。
然后是Timer
,它与其他类似,但可以取消计划任务。 请注意, Timer
也使用JSNI,就像DeferredCommand
一样; 任何使用Timer
的代码都需要GWTTestCase
进行unit testing。