我需要对GWT中的onSuccess
方法进行方法拦截。
我需要在GWT中调用onSuccess方法后在和之后添加一些代码? (我有很多调用onSuccess方法,我需要动态地执行此操作)
修改
我需要在屏幕右上角添加progress bar
,当代码进入onsuccess
方法时会显示onsuccess
,并在{{1}}方法退出时消失。
答案 0 :(得分:1)
从视角来看
void onSuccess(Value v) {
showProgressBar();
doLotsOfWork(v);
hideProgressBar();
}
将是一个无操作。浏览器通常在重新发送DOM之前等待事件处理程序完成执行。如果doLotsOfWork()
方法需要花费相当多的时间来执行(例如> 100ms),则由于JavaScript执行的单线程特性,用户会注意到浏览器打嗝。
相反,请考虑使用incrementally-scheduled command来破坏工作。它看起来大致如下:
void onSuccess(Value v) {
showProgressBar();
Scheduler.get().scheduleIncremental(new RepeatingCommand() {
int count = 0;
int size = v.getElements().size();
public boolean execute() {
if (count == size) {
hideProgressBar();
return false;
}
processOneElement(v.getElements().get(count++));
setProgressBar((double) count / size);
return true;
}
});
}
通过打破浏览器事件循环的多个泵的工作,可以避免在需要做大量工作的情况下,webapp变得无响应的情况。
答案 1 :(得分:1)
嗯,这是一个通用的非功能性要求,我对这个项目进行了一些研究,我已经实现了Thomas Broyer在gwt group上建议的解决方案。这个解决方案比其他建议的解决方案有明显的优势,您不必更改回调类,您只需在创建async gwt-rpc服务后添加一行代码...
IGwtPersistenceEngineRPCAsync persistenceEngine = GWT.create(IGwtPersistenceEngineRPC.class);
((ServiceDefTarget) persistenceEngine).setRpcRequestBuilder(new ProgressRequestBuilder());
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;
public class ProgressRequestBuilder extends RpcRequestBuilder {
private class RequestCallbackWrapper implements RequestCallback {
private RequestCallback callback;
RequestCallbackWrapper(RequestCallback aCallback) {
this.callback = aCallback;
}
@Override
public void onResponseReceived(Request request, Response response) {
Log.debug("onResposenReceived is called");
// put the code to hide your progress bar
callback.onResponseReceived(request, response);
}
@Override
public void onError(Request request, Throwable exception) {
Log.error("onError is called",new Exception(exception));
// put the code to hide your progress bar
callback.onError(request, exception);
}
}
@Override
protected RequestBuilder doCreate(String serviceEntryPoint) {
RequestBuilder rb = super.doCreate(serviceEntryPoint);
// put the code to show your progress bar
return rb;
}
@Override
protected void doFinish(RequestBuilder rb) {
super.doFinish(rb);
rb.setCallback(new RequestCallbackWrapper(rb.getCallback()));
}
}
答案 2 :(得分:0)
你不能这样做。 rpc onSuccess()方法异步运行(换句话说,取决于服务器完成时,应用程序不会等待它)。您可以在rpc调用之后立即触发代码,这可能/可能不会在onSuccess for RPC调用之前完成。
你能解释一下,为什么你想要这样做?由于这种异步行为,你可能不得不重新设计应用程序,但是在你提供用例之前不能说。优选地,在rpc调用之后应该忘记任何异步功能,并且仅在onSuccess中执行操作。