web-dev-qa-db-ja.com

GWT:タイマーとスケジューラのクラス

このページ を数回読んだことがありますが、GWTのTimerクラスとSchedulerクラスの固有の違いのいくつかが見られません。次のそれぞれのユースケースと適用性を探しています。

  • TimerTimer::scheduleおよびTimer::scheduleRepeating
  • Scheduler::scheduleDeferred
  • Scheduler::scheduleIncremental
  • IncrementalCommand
  • DeferredCommand

これらはすべて、多かれ少なかれ同じことをしているように見え、それらすべてで同じ目的を達成できるように感じます。これは、同じことを行うための複数の方法を提供するGWTの方法にすぎませんか?そうでない場合は、それぞれがいつどこで適切に使用されているかを理解するのを手伝ってください。

20
IAmYourFaja

何か他のことをするように指示する前に、ブラウザが現在行っていることをすべて完了する必要がある場合は、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秒後に非表示にします。

32
Andrei Volgin

JavaDocが言うように、DeferredCommandは廃止されてSchedulerになりました。 DeferredCommandIncrementalCommandの問題は、静的な状態にあることです(これにより、テストで確実に使用することが困難になります)。さらに、それらの(静的)メソッドはJSNI呼び出しを行い、コードをテストするためにGWTTestCaseを使用するように強制します(静的メソッドは–簡単に–モック可能ではありません)。静的メソッドは、それらをラップすることも不可能にします(たとえば、ロギングなどを追加するため)。
一方、Schedulerのインスタンスを操作します(テスト可能なコードが必要な場合は、依存性注入を使用してスケジューラーのインスタンスを取得し、Scheduler.get() DI「ファクトリ」を除く)。テストでは、たとえばStubSchedulerを使用できます。

次に、Timerがあります。これは他のタスクと似ていますが、スケジュールされたタスクをキャンセルできます。 Timerは、DeferredCommandと同様に、JSNIも使用することに注意してください。 Timerを使用するあらゆる種類のコードでは、単体テストを行うためにGWTTestCaseが必要になります。

11
Thomas Broyer