如何集中GWT RPC的“加载”屏幕?

时间:2009-09-29 03:01:20

标签: gwt asynchronous rpc generator

如何集中管理GWT异步RPC调用的“加载”图标?我正在寻找一种让每个异步调用自动启动计时器的方法。当计时器触发时,如果RPC尚未完成,则应显示“加载”图标。当RPC完成时(onSuccess()onFailure()),应删除加载图标。

为每次调用手动执行此操作非常繁琐,事实上很容易弄错并让用户留下卡住的UI。

可以使用生成器吗?要清楚 - 我不是在寻找显示对话框或图标的代码;我正在寻找一种集中管理这种对话框/图标的方法。

3 个答案:

答案 0 :(得分:4)

也许我会以更简单的方式看待它。但是我们在应用程序中有类似的行为,我们只是使用装饰器模式来实现它。装饰器负责显示加载UI(在我们的例子中它立即显示),并在返回时确保再次删除UI。

我们的调用看起来有点像这样:

rpc.dosomething( params, Modality.appModal( new AsyncCallback<String>() {
  public void onSuccess( String pValues ) {
    ... handle success ...
  }

  public void onFailure( Throwable pCause) {
    ... handle failure ....
  }
}));

Modality.appModal返回执行UI部分的AsyncCallback,并在成功或失败后调度到调用中作为参数给出的AsyncCallback。

代码生成器值得进一步发展吗?它实施一次,无处可去,无处不在。

大卫

答案 1 :(得分:2)

我通过为ajax调用创建一个util类来解决这个问题。该类包含 loadingIndicator callstaack loadingIndicator 是将显示消息的 PopupPanel callstack 是一个静态列表,其中包含需要加载指示符的所有实际 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) { ... }
}));

答案 2 :(得分:1)

您可以在此处找到一些答案:Automatic ‘loading’ indicator when calling an async function

我同意本页面上的其他人认为不值得使用代码生成器。