У меня есть приложение, которое является потребителем RESTful API, и я хочу, чтобы у меня было время ожидания соединения с API.
Как я искал, а также проверял, метод HttpURLConnection.setReadTimeout () не работает, поэтому я нашел решение использовать AsyncTask, который попытается подключиться к серверу, а затем передатьтайм-аут для AsyncTask.get ().
Работает, частично.Проблема в том, что я делаю следующее:
- Вход в приложение с включенным WiFi.Я нажимаю кнопку «Войти» и получаю «Неверный / Пароль пользователя».Ok.
- Выключите WiFi, нажмите кнопку «Войти».Приложение пытается подключиться, но через 5 секунд (выбранное время ожидания) оно показывает мне диалоговое окно с уведомлением о том, что я не подключен.Ладно, все как положено.
- Включите WiFi обратно, нажмите кнопку «Войти».Он все еще работает, как будто я не был подключен, всегда показывая диалог.Я могу ждать много секунд, но поведение такое же, как если бы я был отключен.
Я отлаживал весь свой код, шаг за шагом, используя Eclipse, и в этой логике нет ничего плохого.Мой HttpURLConnection всегда новый объект, поэтому я не пытаюсь использовать один и тот же объект подключения для подключения после включения Wi-Fi обратно ... Также я использую библиотеку Scribe для OAuth,но я проверил исходный код, и все выглядит нормально, за исключением того, что я изменил метод, который создает соединение, чтобы всегда использовать новый экземпляр.
Я начинаю думать, что Android «кэширует» мой объект соединения илиобъект AsyncTask ...
Ниже приведен код моего класса RequestManager:
public class RequestManager {
private static RequestManager self = new RequestManager();
private Request currentRequest;
private static final long TIMEOUT = 5000;
public static RequestManager getInstance() {
return self;
}
public void startRequest(Request request) {
if (currentRequest != null) return;
currentRequest = request;
}
public String getResponse() throws ConnectionErrorException {
RequestThreat rt = new RequestThread();
rt.execute(currentRequest);
try {
return (String) rt.get(TIMEOUT, TimeUnit.MILISECONDS);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
throw new ConnectionErrorException();
} finally {
endRequest();
}
return null;
}
public void endRequest() {
currentRequest = null;
}
private class RequestThread extends AsyncTask<Request, Integer, String> {
@Override
protected String doInBackground(Request... requestParams) {
return requestParams[0].send().getBody();
}
}
}
Также в методе, который я вызываю getResponse()
, я вызываю endRequest()
после.
Есть мысли?