Каков самый простой способ показать индикатор загрузки во время вызова RPC в GWTP?

Я использую GWTP для создания своего веб-приложения. Вот моя проблема. У меня есть страница клиента (CustPresenter). Когда эта страница посещается, она вызывает и загружает данные из базы данных.

Загрузка всех данных может занять некоторое время, поэтому я хочу, чтобы мой текущий браузер был заблокирован, чтобы пользователь не мог ничего щелкнуть, пока данные еще не завершили загрузку.

Итак, вот что я думаю. Я хочу показать DialogBox прямо перед вызовом 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 отображаются на странице клиента, и пользователь может нажимать любые кнопки на странице, пока данные еще не завершили загрузку. Это не правильное поведение.

Я хочу сделать что-то вроде этого http://sqlfiddle.com/#!2/a2581/1< /а>. Как вы можете видеть, когда вы впервые открываете эту ссылку, появляется всплывающая панель загрузки, и вы не можете ничего щелкнуть, пока не появятся все графические интерфейсы.

Я также пытался сделать Custom 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); 

}

Итак, почему у меня эта проблема?

Как это исправить?

Или вообще, как проще всего отобразить «индикатор загрузки» во время вызова RPC в GWTP?


person Tum    schedule 26.10.2013    source источник


Ответы (1)


Я нашел классное решение, то есть мы должны использовать WidgetPresenter с PopupPanel (скажем, 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)

        }
   };

и тогда он работает очень гладко.

person Tum    schedule 27.10.2013