私はGWTが初めてです。多数のカスタム イベントを使用するMVP ベースのプロジェクト (ここで説明) を作成しています。いくつかのグローバル イベントをリッスンし、イベント ハンドラーで何らかのアクション (DOM への書き込みを含む) を実行するウィジェット (10 以上) がいくつかあります。
私が見つけたのは、UI がブロックされ、1 つのイベントのすべてのハンドラーが処理を完了するまで更新されないことです。これにより、ページの読み込み時や、ウィジェットの更新を引き起こすその他のイベントで、UI の実行が遅くなります。
プレーンな JavaScript/jQuery で同様のプロジェクトを作成しましたが、これはそのプロジェクトの問題ではありませんでした。実際、UI は非常に高速でした。ここで何が間違っていますか?ドキュメンテーションには、GWT は非常にパフォーマンスが高いと記載されているため、やり方が間違っているだけだと結論せざるを得ません。
一例として、日付のプリセット (昨日や先週など) を選択するドロップダウンがあります。これが発生した場合、モデルで選択したプリセットを次のように設定します。
public void setDateRange(DatePreset dateRange) {
this.dateRange = dateRange;
eventBus.fireEvent(new DateChangedEvent(dateRange));
}
各ウィジェットは同じイベントバスにアクセスし、DateChanged イベントをハンドラーに登録します。各ウィジェットは、正しいデータで自身を更新するために、かなりの量のロジックと処理 (ajax 呼び出しの実行を含む) を実行する必要があります。
@Override
public void onDateChanged(DateChangedEvent event) {
DatePreset dateRange = event.getDate();
… additional processing and logic
… ajax call
}
基本的なプロファイリングを行った結果、各ウィジェットの処理が完了するまでに約 100 ~ 150 ミリ秒かかることがわかりました (つまり、UI に 1 ~ 2 秒以上の遅延があることを意味します)。ブロックするとは、すべてが終了するまで、日付のプリセットを選択したドロップダウンが閉じないことを意味します (そして、スピニー ホイールが表示されます)。
これをより速く (そして UI をブロックせずに) 実行するにはどうすればよいですか? 私はどんなアイデアにもオープンです。ありがとう!