2013-07-08 2 views
0

Этот вопрос очень полезен. Есть несколько вопросов о вызове нескольких AsyncCallback, но они не сказали, как их вызвать в цикле.Как сделать несколько вызовов AsyncCallback в Loop в GWTP?

Вот моя проблема. Я делаю проект с использованием Gwt-платформы. Я получил ведущий TestPresenter.java, который имеет следующие коды:

@Inject 
DispatchAsync dispatchAsync; 

private AsyncCallback<GetDataResult> getDataCallback = new AsyncCallback<GetDataResult>() { 

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

    @Override 
    public void onSuccess(GetDataResult result) { 
     // do Something o show the gui here 
    } 
}; 

public void load_All_Gui_At_Once() { 
    for(int i=0; i<5; i++) { 
     GetData getDataAction=new GetData(i); 
     dispatchAsync.execute(getDataAction, getDataCallback); 
    } 
} 

Проблема заключается в том, что программа показывает данные, но он показал в неправильном порядке. Это связано с тем, что следующий метод Async начал работать, пока предыдущий еще не закончен.

Некоторые предложили мне поместить второй вызов внутри onSuccess, но это только для простых 2 вызовов синхронизации. Но в моем случае, я должен зациклить много неизвестного числа вызовов Async, тогда как я могу это сделать?

ответ

3

Это вопрос, аналогичный this one. Все ваши вызовы выполняются в одно и то же время, но время ответа неизвестно и не гарантируется заказ. Таким образом, решение почти то же самое, вызовите цикл внутри обратного вызова. Ваш код должен выглядеть так:

@Inject 
DispatchAsync dispatchAsync; 

private AsyncCallback<GetDataResult> getDataCallback = new AsyncCallback<GetDataResult>() { 
    int idx = 0; 

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

    @Override 
    public void onSuccess(GetDataResult result) { 
    if (result != null) { 
     // do Something or show the gui here 
    } 
    if (idx < 5) { 
     GetData getDataAction = new GetData(idx); 
     dispatchAsync.execute(getDataAction, getDataCallback); 
    } 
    idx ++; 
    } 
}; 

public void load_All_Gui_At_Once(){ 
    // Start the loop, calling onSuccess the first time 
    getDataCallback.onSuccess(null); 
} 
+0

Я изменил бит int idx = -1; В любом случае, спасибо вам за помощь. Он работает отлично. – Tum

+0

изменил его в ответе. –

+0

, если вы установите idx = -1, вам нужно изменить idx ++ на ++ idx. Хотя увеличение idx в конце блока onSuccess является более ясным (таким образом изменил код). –

Смежные вопросы