【问题标题】:GWT: Timer and Scheduler ClassesGWT:定时器和调度器类
【发布时间】:2018-07-14 22:20:17
【问题描述】:

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

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

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

【问题讨论】:

  • 签出this answer
  • 这个问题针对的是Scheduler,而不是Timer,并且不比较何时适合使用一个与另一个。
  • @IAmYourFaja 你的问题似乎有点宽泛。也许一次只关注一个问题。

标签: java gwt scheduler


【解决方案1】:

当您需要浏览器完成它当前正在做的事情,然后再告诉它做其他事情时,请使用 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秒后将其隐藏。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 优秀的答案!这对我有很大帮助。谢谢!
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2023-03-11
    • 2023-04-02
    • 1970-01-01
    • 2016-11-23
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多