ajax 呼び出し用の util クラスを作成することで、この問題を解決しました。このクラスには、loadingIndicator とcallstaackが含まれています。loadingIndicatorは、メッセージを表示するPopupPanelです。コールスタックは、読み込みインジケータを必要とする実際の AsyncCallbackオブジェクトをすべて含む静的リストです。コールバックが発生すると (成功またはエラー)、コールバックはリストから削除されます。ローディング インジケータは、リストにコールバックが残っていない場合にのみ非表示になります。
public class Ajax {
private static final PopupPanel loadingIndicator = WidgetFactory.createLoadingPopup();
private static final List<AsyncCallback<?>> callstack = new ArrayList<AsyncCallback<?>>();
public static <T> AsyncCallback<T> call(final AsyncCallback<T> callback) {
if(!loadingIndicator.isShowing()){
loadingIndicator.center();
}
callstack.add(callback);
return new AsyncCallback<T>() {
@Override
public void onFailure(Throwable caught) {
handleReturn();
callback.onFailure(caught);
}
@Override
public void onSuccess(T result) {
handleReturn();
callback.onSuccess(result);
}
private void handleReturn(){
callstack.remove(callback);
if(callstack.size() < 1) {
loadingIndicator.hide();
}
}
};
}
}
そして、次のような読み込みインジケーターが必要な RPC 呼び出しに使用します。
myService.myMethod(Ajax.call(new AsyncCallback<MyReturnType>() {
@Override
public void onFailure(Throwable caught) { ... }
@Override
public void onSuccess(MyReturnType result) { ... }
}));