2013-06-11 38 views
10

Tôi đang tải xuống tệp zip kích thước lớn từ máy chủ. Tôi đang theo dõiSocketException trong khi tải xuống tệp zip kích thước lớn

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

Ứng dụng của tôi không dừng lại, nhưng quá trình tải xuống của tôi dừng lại. Điều này xảy ra trên điện thoại di động android hdpi đặc biệt nói rằng các thiết bị xử lý thấp. Việc tải xuống hoạt động tốt trên S3 và máy tính bảng. Tôi đang sử dụng phương pháp FileOutputStream đơn giản để tải xuống tệp.

+0

hãy dán mã của bạn ở đây –

Trả lời

3

Nếu bạn đang sử dụng HttpConnection sau đó tăng Timeout

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

con.setReadTimeout (10000);

HOẶC

HttpConnectionParams.setSoTimeout (httpParameters, 10000); //

+0

Nop @hharry tôi đang sử dụng ** BufferedInputStream input = BufferedInputStream mới (url.openStream(), 8192) ; ** –

+0

Theo SO [link] này (http://stackoverflow.com/questions/2638283/can-i-set-a-timeout-for-a-inputstreams-read-function), bạn có thể đặt thời gian chờ trên ổ cắm . 'Socket # setSoTimeout (int)'. –

1

Tôi không chắc chắn điều này có thể là vấn đề nhưng đó là một khả năng. Bạn nói điều này xảy ra trên các thiết bị bộ vi xử lý thấp, có thể xảy ra bitrate ngược dòng máy chủ từ xa lớn đến mức tốc độ bit của máy khách không thể xử lý nó và điều này xảy ra với các tệp lớn, sau một khoảng thời gian nhất định mà thiết bị nhận không xử lý tốc độ bit, các Socket sụp đổ và bạn nhận được thời gian chờ đó.

Đề xuất của tôi đang cố triển khai giới hạn tốc độ băng thông. Bằng cách này, bạn có thể kiểm tra xem các thiết bị chậm có phản ứng tốt hơn với các bản tải xuống dài này hay không, mặc dù chúng sẽ chậm hơn.

3

Tôi đoán, bạn nên mua một WakeLock để hoàn thành tải về của bạn, và sau đó phát hành nó. Đặc biệt, nếu bạn đang tải xuống một tệp lớn thông qua kết nối Wi-Fi, đó là điển hình để có được một WifiLock để giữ cho đài phát thanh tỉnh táo.

Mặt khác, bạn có thể (nếu bạn chưa làm) cũng thử DownloadManager. Như this official article on wakelocks tiểu bang,

"Nếu ứng dụng của bạn hoạt động lâu dài tải HTTP, xem xét sử dụng Download Manager."

0

Để làm việc với máy chủ HTTP Tôi khuyên bạn nên Loopj thư viện cho bạn, đó là thư viện đáng tin cậy, đơn giản và dễ sử dụng. như tài liệu nói rằng bạn có thể tải về một tập tin đơn giản như thế này:

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 
    } 
}); 
Các vấn đề liên quan