在GWTP中的RPC调用期间显示“加载指示符”的最简单方法是什么?

时间:2013-10-26 09:19:31

标签: java gwt gwtp gwt-platform

我正在使用GWTP来构建我的webapp。这是我的问题。我有一个客户页面(CustPresenter)。当访问该页面时,它将调用&从数据库加载数据。

加载所有数据可能需要一段时间,因此我希望锁定当前浏览器,以便用户在数据尚未完成下载时无法点击任何内容。

所以这就是我的想法。我想在进行RPC调用之前显示一个DialogBox&在通话结束时隐藏它。请看下面的代码:

public class CustPresenter extends
    Presenter<CustPresenter.MyView, CustPresenter.MyProxy> {

    private DialogBox loadingDialogBox=new DialogBox();

    @Inject DispatchAsync dispatchAsync;

    @Override
    public void prepareFromRequest(PlaceRequest request){
         super.prepareFromRequest(request);
         loadingDialogBox.show();
         GetData getDataAction=new GetData();
         dispatchAsync.execute(getDataAction, getDataCallback);

    }

    private AsyncCallback<GetDataResult> getDataCallback=new AsyncCallback<GetDataResult>(){

        @Override
        public void onFailure(Throwable caught) {
            loadingDialogBox.hide();
        }

        @Override
        public void onSuccess(GetVerbFromTripleResult result) {
             //show data here (it may take long time)
             loadingDialogBox.hide();
        }
   };
}

然而,在运行时,对话框仅显示1秒钟&amp;然后就消失了。在此之后,所有UiBinder Guis都出现在客户页面上。用户可以在数据尚未完成下载时单击页面上的任何按钮。这不是正确的行为。

我想做这样的事情http://sqlfiddle.com/#!2/a2581/1。正如你所看到的,当你第一次打开那个链接时,一个加载面板弹出&amp;在所有guis出现之前你不能点击任何东西。

我还尝试制作自定义AsyncCallback,但没有发生任何事情

public abstract class AsyncCall<T> implements AsyncCallback<T> {


    PopupPanel myp=new PopupPanel();
    /** Call the service method using cb as the callback. */
    public AsyncCall()
    {
        myp.setTitle("loading");
        myp.show();

    }

    public final void onFailure(Throwable caught) 
    {    
        myp.hide();

        onCustomFailure(caught); 
    } 

    public final void onSuccess(T result) 
    {       
        myp.hide(); 

        onCustomSuccess(result);     
    }
    /** the failure method needed to be overwritte */   
    protected abstract void onCustomFailure(Throwable caught);  

    /** overwritte to do something with result */
    protected abstract void onCustomSuccess(T result); 

}

那么,为什么我会遇到这个问题?

如何解决?

或者一般来说,在GWTP中的RPC调用期间显示“加载指示符”的最简单方法是什么?

1 个答案:

答案 0 :(得分:3)

我找到了一个很酷的解决方案,就是我们必须在PopupPanel中使用WidgetPresenter(比如LoadingPresenter)。所以在我的Custom AsyncCall类中,我需要fire loadingPresenter

public abstract class AsyncCall<T> implements AsyncCallback<T> {


    /** Call the service method using cb as the callback. */
    public AsyncCall()
    {
        Utility.eventBus.fireEvent(new ShowLoadingEvent(true));
    }

    public final void onFailure(Throwable caught) 
    {    
        //myp.hide();
        Utility.eventBus.fireEvent(new ShowLoadingEvent(false));
        onCustomFailure(caught); 
    } 

    public final void onSuccess(T result) 
    {       
        //myp.hide(); 
        Utility.eventBus.fireEvent(new ShowLoadingEvent(false));
        onCustomSuccess(result);     
    }
    /** the failure method needed to be overwritte */   
    protected abstract void onCustomFailure(Throwable caught);  

    /** overwritte to do something with result */
    protected abstract void onCustomSuccess(T result); 

}

要进行RPC调用,只需使用:

  private AsyncCall<GetDataResult> getDataCallback=new AsyncCall<GetDataResult>(){

        @Override
        public void onCustomFailure(Throwable caught) {

        }

        @Override
        public void onCustomSuccess(GetVerbFromTripleResult result) {
             //show data here (it may take long time)

        }
   };

然后它运行得非常顺利。