2013-06-11 10 views
10

Pobieram plik zip o dużym rozmiarze z serwera. Dostaję następująceWyjątek SocketException podczas pobierania pliku zip o dużym rozmiarze

06-11 21:45:18.789: I/System.out(8993): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 

Moja aplikacja nie kończy się, ale moje pobieranie zatrzymuje się. Dzieje się tak na urządzeniach hdpi z Androidem mówiących w uproszczeniu o urządzeniach o niskiej liczbie procesorów. Pobieranie działa poprawnie na S3 i tabletach. Używam prostej metody FileOutputStream do pobrania pliku.

+0

proszę wkleić kod tutaj –

Odpowiedz

3

Jeśli używasz httpconnection następnie zwiększyć Timeout

HttpURLConnection con = (HttpURLConnection) url.openConnection();

con.setReadTimeout (10000);

lub

HttpConnectionParams.setSoTimeout (httpParameters, 10000); //

+0

Nop @hharry używam ** wejście BufferedInputStream = new BufferedInputStream (url.openStream(), 8192) ; ** –

+0

Zgodnie z tym SO [link] (http://stackoverflow.com/questions/2638283/can-i-set-a-timeout-for-a-inputstreams-read-function) można ustawić limit czasu na gniazdach . 'Socket # setSoTimeout (int)'. –

1

Nie jestem całkiem pewny, że to może być problem, ale jest to możliwe. Mówisz, że dzieje się to na urządzeniach o niskim poziomie procesora, może się zdarzyć, że szybkość transmisji danych w odległych serwerach jest tak duża, że ​​szybkość transmisji danych przez klienta nie może obsłużyć go, a jak to się dzieje z dużymi plikami, po pewnym czasie urządzenie odbiorcze może nie obsłuży bitrate, Socket zwija i otrzymasz ten limit czasu.

Moja sugestia jest próbą zaimplementowania ogranicznika szybkości pasma. W ten sposób możesz sprawdzić, czy powolne urządzenia reagują lepiej na te długie pobrania, ale będą wolniejsze.

3

Chyba, należy nabyć blokada wybudzenia, aby zakończyć pobieranie, a następnie zwolnij go. Zwłaszcza, jeśli pobierasz duży plik za pośrednictwem połączenia Wi-Fi, typowe jest, aby zakupić usługę WifiLock, aby nie zasnąć.

Z drugiej strony, możesz (jeśli jeszcze tego nie zrobiłeś) wypróbować DownloadManager. Jak this official article on wakelocks państw,

"Jeśli aplikacja jest wykonujących długotrwały pobieranie HTTP, należy rozważyć użycie DownloadManager."

0

Do pracy z serwerem HTTP gorąco polecam bibliotekę Loopj, jest to niezawodna, prosta i łatwa w użyciu biblioteka. jak powiedział dokumentacji można pobrać plik, po prostu tak:

AsyncHttpClient client = new AsyncHttpClient(); 
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" }; 
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) { 
    @Override 
    public void onSuccess(byte[] fileData) { 
     // Do something with the file 
    } 
}); 
Powiązane problemy