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
Czy Twoja aplikacja działała z mniejszym rozmiarem pliku? – momo
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. –
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