Unable to resolve host "hostname": No address associated with hostname. Подводные камни

Рейтинг: 1Ответов: 1Опубликовано: 22.04.2015

При работе с сетью в Android (4.2.2) возникает такая ошибка, в целом ошибка понятна, не понятно дальнейшее ее поведение:
Иногда при возникновении этой ошибки запрос к серверу не завершается, а продолжается и будет выполненным в течении 2-3 минут.
Можно ли как-то это обойти, то есть: есть exception - прерываем дальнейшее использование сети?

Сейчас такая обработка ошибки, собственно только вывод в лог и закрытие соединения (за блоком try/catch):

try {
    DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
    wr.write(data.getBytes("UTF-8"));
    wr.flush();
    wr.close();

    responseCode = connection.getResponseCode();
    is = connection.getInputStream();
    setAvailableConnect(true);
} catch (Exception e) {
    is = connection.getErrorStream();
    if (responseCode == 0) {
        appLog.error("No internet connection, error=" + e.getMessage(), true);
    } else {
        appLog.error("error #" + responseCode + ": " + getErrorFromStream(is), true);
    }
}

В логе сервера:

request #12
request #13 <-- Повторный запрос уже после exception
request #14
request #15
request #16
request #13 <-- Тот запрос на который был exception
request #17

В логе клиента:

request #12
error in request #13
request #13
request #14
request #15
request #16
request #17

Это рушит логику работы приложения, так как приложению важен порядок запросов и их 100% доставка (это идет синхронизация данных), поэтому запросы выполняются последовательно в одном потоке, если какой либо запрос отправлен неудачно, то он повторяется спустя некоторое время, при этом остальные запросы до этого момента не делаются.

Ответы

▲ 1Принят

Есть такие варианты:

1) нежелательный вариант - открыть долгий коннекшн и передавать все сообщения, скажем 10'000 штук. Нежелательный этот вариант потому что долгие коннекшины для мобильного девайса это проблема, особенно для мобильного интернета, и тем более если такие запросы будут регулярно.

2) посмотреть конфигурация таймаутов на сервере. Там это должно настраиваться, чтоб запросы через 2-3 минут не обрабатывались

3) Самый правильный вариант - чтоб сервер проверял - не было ли ранее таких сообщений, и если уже были то не вставлял их. В самом простом случае задать каждому сообщению порядковый номер 1,2,3 итд, или уникальный типа UUID или timestamp. (или всей пачке)