このページ を数回読んだことがありますが、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
のインスタンスを操作します(テスト可能なコードが必要な場合は、依存性注入を使用してスケジューラーのインスタンスを取得し、Scheduler.get()
DI「ファクトリ」を除く)。テストでは、たとえばStubScheduler
を使用できます。
次に、Timer
があります。これは他のタスクと似ていますが、スケジュールされたタスクをキャンセルできます。 Timer
は、DeferredCommand
と同様に、JSNIも使用することに注意してください。 Timer
を使用するあらゆる種類のコードでは、単体テストを行うためにGWTTestCase
が必要になります。