Я разработал класс Позволяет называть его AsyncClass, который реализует AsyncCalllback. Он имеет две глобальные переменные boolean flag
и Object val
. И конструктор выглядит следующим образом:GWT Сделать синхронный/блокирующий вызов с использованием обратного вызова Asynchronus
AsyncClass()
{
this.flag=false;
this.val=null;
}
и onSuccess()
функция определяется следующим образом:
public void onSuccess(Object x){
this.flag=true;
this.val=x;
}
Теперь то, что я хочу, это, чтобы получить возвращаемое значение здесь. Так что я сделать вызов:
AsyncClass callback=new AsyncClass();
service.getResult(createRequestObject(),callback)
и у меня есть ход время цикла, который держит в ожидании флаг, чтобы включить верно.
while(!callback.flag);
Однако он застревает в бесконечном цикле. Почему это происходит ???
Вам необходимо использовать методы onFailure и onSuccess для AsyncCallback.GWT управляется событиями, поэтому вызов будет успешным или неудачным, и один из этих методов будет вызван. Подумайте об этом как о вызове и забудьте, а затем дождитесь события, будь то onSuccess или onFailure ... – WLGfx
Это именно то, что я делаю. Предполагается, что метод onSuccess включит флаг, поэтому условие while while встречается false и оно завершается. Но цикл while продолжает действовать вечно. Это потому, что объект обратного вызова удерживается текущим потоком, и пока он не отпустит его, ничего не может произойти? –
Правильно - есть только один поток, поэтому нет возможности даже попробовать запустить onSuccess, пока код, который запустил вызов на сервер, не вернул управление браузеру. –