Chcę zwrócić wartość false, jeśli połączenie z adresem URL trwa dłużej niż 5 sekund - jak to możliwe za pomocą języka Java? Oto kod, którego używam, aby sprawdzić, czy adres URL jest prawidłowy
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
java.net.ConnectException: Connection timed out: connect
zanim miną nawet 2 minuty. Czy wiesz, co jest przyczyną problemu?setConnectTimeout
przed którąkolwiek z metod, które niejawnie łączą się (w zasadzie wszystkie metody, które zgłaszają IllegalStateException, jeśli są już połączone). Idealnie byłoby ustawić setConnectTimeout (readTimeout) jako pierwsze wywoływane metody.con.setReadTimeout()
działało zgodnie z oczekiwaniami.Możesz ustawić limit czasu w ten sposób,
źródło
Jeśli połączenie HTTP nie przekracza limitu czasu, możesz zaimplementować sprawdzanie limitu czasu w samym wątku w tle (AsyncTask, Service itp.), Poniższa klasa jest przykładem dla Dostosuj AsyncTask, który limit czasu po pewnym okresie
Próbka do tego
źródło
onPreExecute()
. Ponadto, jeśli anulujesz zadanie ręcznie, powinieneś również anulować zaplanowane połączenie, aby uniknąć wycieków.Mogłem rozwiązać podobny problem dodając prostą linię
Moim wymaganiem była znajomość kodu odpowiedzi, a do tego wystarczyło samo uzyskanie metainformacji, zamiast pełnej treści odpowiedzi.
Domyślną metodą żądania jest GET, a jej powrót zajmował dużo czasu, w końcu rzucając mi SocketTimeoutException. Odpowiedź była dość szybka, gdy ustawiłem metodę żądania na HEAD.
źródło
HEAD
żądanie, które nie wygeneruje żadnej treści odpowiedzi..setRequestMethod("HEAD")
w swoim kodzie. Co dziwne, ten opis był dokładnie tym, czego potrzebowałem, aby zmniejszyć problem „Zbyt wiele otwartych plików”. Więc dziękuję?