2011-08-22 11 views
6

Pracuję nad aplikacją dla Androida, która wymaga użycia HttpClient, aby przesłać plik z urządzenia z systemem Android na serwer WWW. Przesyłany przeze mnie plik może osiągać rozmiary do 1 Gb, więc może wystąpić przekroczenie limitu czasu, jeśli urządzenie straci połączenie podczas przesyłania. Dziwne jest to, że ustawiony przeze mnie limit czasu dla gniazda nie wydaje się mieć żadnego skutku. Aplikacja po prostu zawiesiłaby się, gdybym straciła połączenie, zamiast podnosić wyjątek SocketTimeoutException.Błąd Apache HttpClient 4.0 dla gniazda na Androidzie

Próbowałem za pomocą:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

ale pracował tylko dla limitu czasu połączeń, nie timeout gniazdo. Również próbowałem:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

Powód wiem, że limit czasu połączenia działa to, bo chciałbym uzyskać wyjątek dla limitu czasu połączenia po wykonaniu

httpclient.execute(httppost); 

Aplikacja wydaje się powiesić, gdy połączenie zostanie przerwane podczas przesyłania , ale po pomyślnym nawiązaniu połączenia z serwerem.

Aby przetestować moją aplikację, wyłączyłem sieć w różnych momentach, aby zobaczyć, jak zareaguje aplikacja. Jeśli wyłączysz sieć przed wysłaniem żądania, otrzymam błąd połączenia i moja aplikacja może to z wdzięcznością obsłużyć, ale jeśli wyłączysz to podczas przesyłania, aplikacja zawiesi się. Oczywiście robię wszystkie te żądania za pośrednictwem AsyncTasks, więc główny wątek UI nie ulega awarii. Zastanawiam się tylko, czy istnieje jakikolwiek inny sposób, aby upewnić się, że gniazdo będzie limit czasu, gdy nie otrzyma żadnych danych, lub jeśli brakuje mi tutaj. Czytałem wiele blogów i postów, ale większość z nich po prostu sugeruje użycie SO_TIMEOUT, które nie działa dla mnie.

sotimeout not working in a multipart http post on android 2.1

+0

Czy Twoja aplikacja działała z mniejszym rozmiarem pliku? – momo

+0

Próbowałem 1 mb plików i błąd nadal tam jest.Sądzę, że przy mniejszych plikach będziesz miał większe prawdopodobieństwo rozłączenia w czasie pomiędzy przesyłaniem plików, ale to poza tym. Chcę, aby moja aplikacja była niezawodna w przypadku awarii sieci. –

+0

Mam ten sam dokładny problem, z wyjątkiem tego, że moje rozmiary przesyłania są dość małe, rzędu kilku kb. Wszystko, co wydaje się być wymagane do wywołania błędu, to zejście do sieci po sprawdzeniu, czy jest ona uruchomiona, ale przed wywołaniem execute(). – Michael

Odpowiedz

0

Czy tworząc własne ClientConnectionManager? Spójrz na source dla AndroidHttpClient.newInstance().

Tworzą nowy obiekt BasicHttpParams i przekazują go do konstruktorów zarówno dla ThreadSafeClientConnectionManager, jak i DefaultHttpClient. Nie widzę sposobu, aby ustawić parametry w ClientConnectionManager, z wyjątkiem konstruktora.

+1

Tak Jestem rozszerzenie DefaultHttpClient, aby utworzyć własne HttpClient, który włącza SSL. Rozszerzona klasa przesłania metodę createClientConnectionManager() i ustawia HttpParams zgodnie z podanymi wskazaniami. Wymieniony przeze mnie kod był w stanie ustawić poprawny limit czasu połączenia, ponieważ gdy zwiększyłem czas oczekiwania, czas, w którym musiałem czekać aż do podniesienia wyjątku również odpowiednio wzrósł. Jedynym problemem jest to, że limit czasu gniazda nigdy nie zostanie podniesiony bez względu na wartości, które próbuję. –

0

Mam do czynienia z tym samym problemem co ty, z tym samym przypadkiem użycia. Zdarza się to na Samsung Galaxy S2 z systemem Android 2.3.6, ale nie z tego samego urządzenia na 4.x. Niestety to jest dokładnie to urządzenie, z którego korzysta mój klient, i działa dobrze na około 10 innych urządzeniach testowych z różnymi wersjami Androida i konstruktorami ...

Spędziłem godziny próbując z biblioteką Apache, ale z końcem HttpClient, ale efekt końcowy Jest taki sam. AndroidHttpClient pokazuje to samo zachowanie. To prowadzi mnie do powiedzieć, że to brzmi jak implementacji sprzętowej lub OS problemu związanego ...

Jedyne obejście znalazłem umieścić metodę HttpClient.execute() w osobnym wątku i wywołać thread.join(timeout) jako zabezpieczenie, aby zatrzymać wątek jeśli coś idzie źle. Wadą jest to, że ładowanie działa dobrze, ale trwa dłużej niż limit czasu, żądanie zostaje przerwane ...

Jeśli coś znalazłeś w międzyczasie, byłbym bardzo wdzięczny, gdybyś mógł go udostępnić.

Powiązane problemy