我有问题。我在GWT上呼叫服务器端。结果 call是一个ArrayList(结果)。另外在onSuccess方法里面 ArrayList包含结果。但是,如果我想使用 在onSuccess方法之外的ArrayList lista它包含0个元素, 但内部就像结果ArrayList。我该如何解决?我试过了 使用lista作为类属性,静态属性,...但它没有 运行
好吧,我已经更改了我的代码,但它没有运行。我在调用onSuccess时调用另一个方法...
public void addContainers() throws Exception {
gwtService.obtainAttributesDevice(1, new AsyncCallback<ArrayList<String>>(){
@Override
public void onFailure(Throwable caught) {
System.out.println("ERROR");
Window.alert(caught.getMessage());
}
@Override
public void onSuccess(ArrayList<String> result) {
lista.addAll(0, result);
addProjectContainers();
}
});
private void addProjectContainers() throws Exception {
RootPanel.get("mainContainer").add(new Label("Array lista 2: "+lista.toString()));
RootPanel.get().add(new Label(String.valueOf("Array lista 2: "+lista.size())));
for(int i = 0; i < lista.size(); i++){
RootPanel.get().add(new Label("BOTON "+i));
}
}
答案 0 :(得分:2)
如果它有助于将onSuccess和onFailure的内容视为与其余代码分开运行的线程(它实际上不是一个线程,但它不与其余代码同步运行,这就是为什么它被称为“异步”)。
如果你在类中创建一个引用this
的final或成员变量来执行asynchCall那么回调可能有助于保持简单并避免大量缩进并减少你需要定义的决赛数量可以调用方法来处理响应。
伪代码示例(非常简化):
class foo{
protected callingClass = this;
void fetchData(){
service.getData(new Callbac(){
onSuccess(List<Data> data){
callingClass.processData(data);
}
}
}
void procesData(List<Data> fetchedData){
// Add data etc..
}
}
编辑关于通话后的大量代码:
如果你需要在回调后做很多“东西”,只需将它放在onSuccess或你在onSuccess调用上的方法(例如在我的样本中)。
如果你需要按顺序进行多次回调(重新排序它们会导致错误),你首先应该调整一个服务方法来组合这几个动作(如果可能的话),或者你应该在onSuccess回调中做另一个服务器调用。为了简化这一过程,避免使用非常深层嵌套的代码,您可以使用自定义回调接口来定义要在调用下一个服务器调用的第一个回调中使用的匿名类。
我经常使用这个接口来定义使用这个接口(或其变体)回调后要完成的事情:
public abstract class AfterCompleteAction {
/**
* The stuff to do when the method receiving this callback is finished.
*/
public abstract void run();
}
答案 1 :(得分:0)
我认为您需要了解有关异步调用的更多信息 - see here。
问题在于,当GWT获取ArrayList的值时,代码会继续。在GWT返回数据之前,您不能使用ArrayList的内容 - 否则,正如您所发现的那样,将无法使用数据。
答案 2 :(得分:0)
请阅读有趣且内容丰富的Great Beer类比:
https://groups.google.com/forum/#!topic/google-web-toolkit/-soVdfMGug8
这可以解释你遇到的问题。