【问题标题】:What is the simplest way to show "loading indicator" during an RPC call in GWTP?在 GWTP 中的 RPC 调用期间显示“加载指示器”的最简单方法是什么?
【发布时间】:2013-10-26 09:19:31
【问题描述】:

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

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

这就是我的想法。我想在进行 RPC 调用之前显示一个对话框并在调用完成时隐藏它。看下面的代码:

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 秒然后消失。之后,所有 UiBinder Guis 都会显示在客户页面上,用户可以在数据尚未完成下载时单击页面上的任何按钮。这不是正确的行为。

我想做这样的事情http://sqlfiddle.com/#!2/a2581/1。如您所见,当您第一次打开该链接时,会弹出一个加载面板并且您无法单击任何内容,直到所有 gui 出现。

我也尝试过自定义 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 调用期间显示“加载指示器”的最简单方法是什么?

【问题讨论】:

    标签: java gwt gwtp gwt-platform


    【解决方案1】:

    我找到了一个很酷的解决方案,那就是我们必须将 WidgetPresenter 与 PopupPanel 一起使用(比如 LoadingPresenter)。所以在我的自定义 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)
    
            }
       };
    

    然后它运行得非常顺利。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多