HttpurLConnection, проблема включения / выключения WiFi и попытки подключения - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть приложение, которое является потребителем 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() после.

Есть мысли?

1 Ответ

0 голосов
/ 04 апреля 2011

Прежде чем пытаться получить доступ к сети, вы должны проверить, доступно ли сетевое соединение.Посмотрите на этот вопрос:

В частности:

NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...