GWT:计时器和调度程序类

2022-09-02 02:53:36

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

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

这些似乎都在做同样的事情,或多或少,感觉你可以用它们来实现相同的目标。这是否只是GWT提供多种做同样事情的方式?如果没有,请帮助我了解何时何地适当地使用了每种方法。


答案 1

当您需要浏览器完成它当前正在执行的操作,然后再告诉它执行其他操作时,请使用计划程序。例如:

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 秒后将其隐藏。


答案 2

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

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


推荐