2012-12-08 2 views
2

У меня есть интересная проблема.Тайм-аут для UnknownHostException с установленным соединением, но без Интернета

У меня есть приложение, внутри которого я пытаюсь объяснить условие, когда телефон подключен к маршрутизатору, но этот маршрутизатор не подключен к Интернету.

Я пробовал несколько способов установления соединения, но NONE из тайм-аутов учитывает это условие.

Я пробовал:

HttpParams httpParameters = new BasicHttpParams(); 
int timeoutSocket = 1000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutSocket); 

Я также попытался:

HttpURLConnection huc = (HttpURLConnection)serverAddress.openConnection(); 

huc.setDoOutput(true); 
huc.setRequestMethod("PUT"); // For amazon 
//huc.setRequestMethod("POST"); // For regular server. 
huc.setRequestProperty("Content-Type", "text/plain"); 
huc.setRequestProperty("Content-Length", String.valueOf(bytes)); 
huc.setFixedLengthStreamingMode(bytes); 
huc.setConnectTimeout(1000); // Establishing connection timeout 
huc.setReadTimeout(1000); 

Но в обоих случаях, когда я исполняю/получить выходной поток, он занимает около 20 секунд, чтобы получить ошибка UnknownHostException.

Я хотел бы, чтобы это было достигнуто максимум за 5 секунд до достижения этого вывода.

Есть ли способ сделать это?

Приветствия

ответ

2

Через много поисков и через помощь this ссылке, которую я нашел твердый раствор, что швы будут работать так далеко.

Мое понимание вывод в том, что, когда я использую такие методы, как:

DataOutputStream wr = new DataOutputStream(huc.getOutputStream()); 

или

InputStream is = ucon.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 

(загрузки или скачивания)

Существует много вещей происходит под капот. Включает вызов поиска DNS. При отсутствии подключения, но при подключении к маршрутизатору это занимает около 20 секунд, чтобы, наконец, достичь неизвестного исключения.

Однако, если добавить эту строку кода первого до выше кода выполняется:

InetAddress iAddr = InetAddress.getByName("myserverName.com"); 

Тогда это даст мне правильный SocketTimeOutException и реагирует точно, как я хотел бы надеяться/ожидать, что она. Вышеупомянутая строка кода, по-видимому, кэширует DNS-поиск, и тайм-ауты работают должным образом.

Кроме того, что-то примечание: после того, как сбой будет зашифрован, выполнение вышеуказанного кода займет столько же времени, сколько и другой предыдущий код. (Не могу точно сказать, что именно это вызовет). Но если вы снова подключитесь к Интернету, а затем снова войдете в подключенное, но не подключаемое состояние, более ранний успех будет кэширован, и таймауты снова будут работать правильно.

Это было не так просто найти или выяснить, так что я надеюсь, что это поможет кому-то.

Cheers,

+0

Не могли бы вы рассказать, где я должен помещать эту строку кода, относящуюся к UrlConnection? –

+0

Вы должны просто указать его перед URLConnection, то есть: URL-адрес = новый URL-адрес («Ваш URL-адрес»); InetAddress inetAddress = InetAddress.getByName (адрес.getHost()); URLConnection urlConnection = address.openConnection(); – Dave

0

Вы могли бы реализовать CountDownTimer, который имеет предел 5000 мс увидеть это http://dewful.com/?p=3

+0

Привет, brux, к сожалению, это решение не работает для моей реализации.Мне нужно написать кучу дополнительного кода для управления моими другими синхронными операциями. Я нашел простое решение, которое не требует сложного кода, и швы работают достаточно эффективно. Я благодарен вам за ответ. Приветствия. – Dave