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() първо извършва async извикване на вашата услуга и след това незабавно връща полето records, което винаги ще бъде нула (ако приемем, че никога не е променяно досега).

Трябва да изчакате отговорът да се върне (обработва се от onSuccess/onFailure). И като цяло никога не използвайте гетери, които разчитат на асинхронни извиквания, но проектирайте приложението си така, че да 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