GWT:计时器和调度程序类

IAm*_*aja 20 java gwt scheduler

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

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

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

And*_*gin 32

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

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

    @Override
    public void execute() {
        myTextBox.setFocus();
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Tho*_*yer 11

正如JavaDoc所说,DeferredCommand不赞成使用Scheduler.这个问题DeferredCommandIncrementalCommand是,他们有一个静态的状态(这使得它很难在测试中可靠地使用).而且,它们的(静态)方法会使JSNI调用强制您使用a GWTTestCase来测试代码(静态方法不能 - 易于模拟).静态方法也使得无法包装它们(例如添加一些日志记录或其他内容).
另一方面,您使用a的实例Scheduler(如果您想要可测试的代码,您将使用依赖注入来获取调度程序的实例,Scheduler.get()除了在您的DI"工厂"之外永远不会调用).在测试中,您可以使用StubScheduler例如.

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