2011-07-15 16 views
5

Mam bardzo duży błąd w mojej aplikacji, którego naprawdę nie mogę rozwiązać. Ilekroć nawiązać połączenie odpoczynku poprzez następujący kod:Wykonanie HttpClient daje ConnectTimeoutException

HttpGet request = new HttpGet(url + getParams()); 

    HttpParams httpParameters = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(httpParameters, 5000); 
    HttpConnectionParams.setSoTimeout(httpParameters, 10000); 

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 

    httpClient.execute(request); 

pojawia się błąd w DDMS:

07-15 11:22:47.448: WARN/System.err(973): org.apache.http.conn.ConnectTimeoutException: Connect to (some ip-address) timed out 

Ale czasami kod działa idealnie i otrzymam moje dane, jak powinien. Przetestowałem także pozostałe połączenia z serwerem za pośrednictwem normalnej przeglądarki na moim komputerze i to zawsze daje moje dane w ciągu 100 ms. Co więc robię źle? Przetestowałem go również na innym urządzeniu, ale to daje mi ten sam problem. Byłbym bardzo zadowolony, gdyby ktoś mógł rozwiązać mój problem :)

+0

Th prawdopodobnie ma związek z wolną siecią (czy korzystasz z Wi-Fi czy 3G?). Spróbuj uruchomić go w emulatorze. Może być konieczne zwiększenie limitu czasu połączenia i skonfigurowanie mechanizmu ponawiania próby. – kgiannakakis

+0

Tak, ale z moimi innymi aplikacjami mogę uzyskać żądane dane przez cały czas. Z jednym z telefonów korzystam z WiFi, ale ten daje mi wyjątki. I o ile mi wiadomo, httpclient ma mechanizm automatycznego powtarzania? – Martijn538

+0

Zwiększ limit czasu do 20-30 sekund. Czasami linia może być zajęta, a tym samym limit czasu. –

Odpowiedz

0

Sprawdź, czy jesteś w stanie połączyć się za pomocą urządzenia programującego, sprawdź również czasy ładowania. Istnieje bardzo duża szansa, że ​​czasy oczekiwania są zbyt małe.

+0

Zmieniłem limity czasu na 20 sekund, wciąż ten sam problem. Czego można jeszcze spróbować? Czy ktoś wcześniej nie wpadł na ten problem? – Martijn538

+0

Czy masz dostęp do adresu URL swojego urządzenia? –

+0

Tak, ale problem polega na tym, że czasami ładuje się dobrze i na czas, a czasami nie ładuje się wcale! – Martijn538

1

Mam ten sam problem.

Spróbuj użyć bezpośredniego adresu IP do swoich żądań. Zauważyłem, że czasami wyszukiwania DNS Androida zachowują się dość dziwnie. Przeszukałem i znalazłem to: http://mailinglists.945824.n3.nabble.com/Android-and-reverse-DNS-lookup-issues-td3011461.html.

Nie wiem, czy to istotne, czy nie, nadal próbuję znaleźć obejście. Może ktoś tutaj może rzucić okiem i zrozumieć.

+0

Miał dokładnie ten sam problem po zmianie mojego pliku hosts. Ponowne uruchomienie telefonu rozwiązało problem. – Niels

5

Problem to DefaultHttpClient. Czy używasz go asynchronicznie? Ponieważ kod DefaultHttpClient nie jest wątkiem, używanie go w środowisku asynchronicznym może powodować problemy. Miałem ten problem wcześniej, gdy moja działalność rozpoczęła wiele połączeń HTTP w tym samym czasie i skończyło się na zmianie go na HttpURLConnection. Można odwołać się do tej strony: http://www.vogella.de/articles/AndroidNetworking/article.html

0

miał podobny problem, może być powielana tylko wtedy, gdy próbuje się połączyć, stosując jednocześnie kilka urządzeń i roztwór:

Instance restart rozwiązać problemy z połączeniami. (lub po prostu trzeba ponownie uruchomić usługę sieciową)

(c) Serwer/instance Administrator

Ponadto, istnieją ludzie, którzy doświadczają podobnych problemów i kilka innych rozwiązań dla nich pracował, na przykład:

  1. Wyłącz tcp_timestamp
  2. Wyłącz tcp_tw_reuse & tcp_tw_recycle
  3. Włączone VM tryb oszczędzania w Android Manif est: android: vmSafeMode = "true"