GWT RPC AsynCallback пропускает методы onSucces и onFail

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

Спасибо за помощь.


person Uğurcan Şengit    schedule 12.04.2013    source источник
comment
Подсказка: асинхронный == неблокирующий.   -  person Thomas Broyer    schedule 12.04.2013
comment
возможный дубликат возвращаемого значения gwt при завершении асинхронного обратного вызова   -  person Thomas Broyer    schedule 12.04.2013


Ответы (3)


Вы должны думать асинхронно. Метод getRecords() сначала выполняет асинхронный вызов вашей службы, а затем немедленно возвращает поле records, которое всегда будет нулевым (при условии, что до сих пор не изменялось).

Вы должны дождаться возврата ответа (обрабатывается _3 _ / _ 4_). И, как правило, никогда не используйте геттеры, которые полагаются на асинхронные вызовы, а разработайте свое приложение для wait ответов / событий.

В вашем случае просто поместите асинхронный вызов в onModuleLoad() и только внутри onSuccess() используйте setFileGridData(result.getRecords()), вообще избегая геттера.

person Andrea Boscolo    schedule 12.04.2013
comment
Я добавил эту строку в 'recordSvc.getRecords (recordclass, this);' onModuleLoad, и я добавил setFileGridData (getRecords ()); к onSuccess, я также вызвал onSuccess (recordclass); это в процессах файловой сети. Я понял, что вы пытались сказать, но полагаю, что не смог реализовать свой код. Это по-прежнему дает нулевое значение. - person Uğurcan Şengit; 12.04.2013
comment
Вам не нужно звонить onSuccess(). Он получает звонил вам, когда ответ придет с сервера. - person Andrea Boscolo; 12.04.2013

Вы создаете новый RecordCallBack. Таким образом, onFailure и onSuccess будут вызываться в новом экземпляре. Вместо этого вы можете попробовать выполнить следующие действия.

public void getRecords() {
    recordSvc.getRecords(recordclass, this);
}
person Jaydeep Rajput    schedule 12.04.2013
comment
Я пробовал это, но у меня все еще есть нулевое значение для переменной recordclass - person Uğurcan Şengit; 12.04.2013
comment
Я только что исправил ту часть, которую вы сказали, но ничего не изменилось. Какая часть вам нужна? Я бы это отредактировал. - person Uğurcan Şengit; 12.04.2013

После всех объяснений

ваш код должен понравиться

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);
    }

});

}
person Suresh Atta    schedule 12.04.2013