Я определяю, как обрабатывать ответ, который я получаю от своего сервера, в анонимном внутреннем классе, где я храню ответ в Map для обеспечения доступа извне этого внутреннего класса.
Поскольку мой серверный вызов асинхронный, я реализовал цикл while, чтобы дождаться, когда результат будет помещен в карту, прежде чем вернуть его вызывающей функции.
Однако, каким-то образом мой цикл не выполняется (насколько я могу судить, по крайней мере), и цикл, кажется, блокирует мой запрос от завершения, что, очевидно, приводит к бесконечному циклу.
public Login getLoginByUsername(String username)
{
long callID = counter.incrementAndGet();
System.out.println("Start call");
ServerConnection.get("myURI",null, new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response){
try {
System.out.println("Call success, enter result:");
callResults.put(callID, new CallResult(Login.parseFromJson(response)));
System.out.println(callResults.get(callID));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
System.out.println("start waiting");
while(callResults.get(callID) == null){
//wait
System.out.print(".");
}
System.out.println("\nwaiting over, return result:");
System.out.println(callResults.get(callID));
return (Login) callResults.remove(callID).content;
}
Я уверен, что запрос работает просто отлично. Если я удаляю цикл (и возвращаю ноль, чтобы предотвратить доступ NPE к еще не завершенному результату), я могу видеть из выходов консоли, что запрос выполнен и дает действительный результат после завершения функции.
Я также попытался переместить весь запрос (ServerConnection.get
) в другой метод на тот случай, если метод, выполняющий асинхронный вызов, должен по какой-то причине завершиться для выполнения вызова. Это тоже не помогло.
Кроме того, я никогда не получаю вывод консоли, определенный в цикле, поэтому я сомневаюсь, что он даже выполняется должным образом ...
Что здесь происходит, и как я могу это исправить?