1

我尝试编写 GWT 应用程序,我需要使用 RPC 从服务器端获取结果。我遵循了 GWT RPC 教程并最终得到了一些商品。但是当我调试我的程序时,我看到我的程序跳过了onFailure和onSuccess方法,所以我得到了nullpointerexception。这是我实现的必要部分。

IRecordServiceAsync recordSvc = GWT.create(IRecordService.class);
private class RecordCallBack implements AsyncCallback<Records> {
    public void onFailure(Throwable caught) {
        // TODO Auto-generated method stub
    }

    public void onSuccess(Records result) {
        records = result.getRecords();
    }

}
public void onModuleLoad() {
setFileGridData(getRecords());
.
.
.
}
public HashMap getRecords() {
    recordSvc.getRecords(recordclass, new RecordCallBack());
    return this.records;
}

正如我所说,我的程序跳过了 onFailure 和 onSuccess 部分,因此我的记录值变为空。

感谢帮助。

4

3 回答 3

3

你必须异步思考。该方法getRecords()首先对您的服务进行异步调用,然后立即返回该records字段,该字段将始终为空(假设到目前为止从未修改过)。

您必须等待响应返回(由onSuccess/处理onFailure)。而且,一般来说,永远不要使用依赖异步调用的 getter,而是将您的应用程序设计wait为响应/事件。

在您的情况下,只需将异步调用放入onModuleLoad()and only inside onSuccess(),使用 the setFileGridData(result.getRecords()),完全避免使用 getter。

于 2013-04-12T08:53:36.497 回答
1

您正在创建新的 RecordCallBack。因此将在新实例上调用 onFailure 和 onSuccess。您可以尝试以下操作,而不是这样做

public void getRecords() {
    recordSvc.getRecords(recordclass, this);
}
于 2013-04-12T08:46:42.643 回答
1

在所有的解释之后

你的代码应该喜欢

onModuleLoad(){
  recordSvc.getRecords(new RecordCallBack<Records>(){


 public void onFailure(Throwable caught) {
        // TODO Auto-generated method stub
    }

    public void onSuccess(Records result) {
        records = result.getRecords();
        setFileGridData(records);
    }

});

}
于 2013-04-12T09:53:35.810 回答