Tôi đang làm việc trên một ứng dụng Android yêu cầu sử dụng HttpClient để tải tệp từ thiết bị Android lên máy chủ web. Tệp tôi đang tải lên có thể đạt đến kích thước tối đa 1 Gb và do đó, thời gian chờ có thể xảy ra nếu thiết bị mất kết nối trong quá trình tải lên. Điều kỳ lạ là thời gian chờ tôi đặt cho các ổ cắm dường như không có bất kỳ tác dụng. Ứng dụng sẽ chỉ treo bất cứ khi nào tôi mất kết nối thay vì tăng SocketTimeoutException.Apache HttpClient 4.0 không hết thời gian chờ cho ổ cắm trên Android
tôi đã cố gắng sử dụng:
HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT);
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT);
nhưng điều này chỉ làm việc cho thời gian chờ kết nối, không phải là thời gian chờ socket. Ngoài ra tôi đã cố gắng:
HttpParams p = httpclient.getParams();
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
Lý do tôi biết rằng thời gian chờ kết nối làm việc là bởi vì, tôi sẽ có được ngoại lệ cho thời gian chờ kết nối sau khi thực hiện
httpclient.execute(httppost);
Ứng dụng này dường như bị treo khi kết nối bị mất trong quá trình tải lên , nhưng sau khi ứng dụng đã thực hiện thành công kết nối đến máy chủ.
Để kiểm tra ứng dụng của mình, tôi đã tắt mạng vào các thời điểm khác nhau để xem ứng dụng sẽ phản ứng như thế nào. Nếu tôi vô hiệu hóa mạng trước khi gửi yêu cầu, tôi gặp lỗi kết nối và ứng dụng của tôi có thể xử lý một cách duyên dáng điều đó, nhưng nếu tôi tắt nó trong khi tải lên ứng dụng sẽ bị treo. Tất nhiên tôi đang thực hiện tất cả các yêu cầu này thông qua AsyncTasks, do đó, giao diện người dùng chính không sụp đổ. Tôi chỉ tự hỏi nếu có bất kỳ cách nào khác để đảm bảo rằng các socket sẽ hết thời gian khi không nhận được bất kỳ dữ liệu, hoặc nếu tôi là thiếu bất cứ điều gì ở đây. Tôi đã đọc nhiều blog và bài đăng, nhưng hầu hết trong số họ chỉ đề xuất sử dụng SO_TIMEOUT không hoạt động cho tôi.
sotimeout not working in a multipart http post on android 2.1
Ứng dụng của bạn có hoạt động với tệp kích thước nhỏ hơn không? – momo
Tôi đã thử 1 tệp mb và lỗi vẫn còn đó.Tôi đoán với các tệp nhỏ hơn, bạn sẽ có nhiều khả năng bị ngắt kết nối trong thời gian giữa các tệp tải lên, nhưng đó là ngoài điểm. Tôi muốn có thể làm cho ứng dụng của tôi mạnh mẽ trong trường hợp lỗi mạng. –
Tôi gặp vấn đề chính xác này, ngoại trừ kích thước tải lên của tôi khá nhỏ, theo thứ tự vài kb. Tất cả những gì dường như được yêu cầu để kích hoạt lỗi là cho mạng để đi xuống sau khi tôi kiểm tra xem nó có lên nhưng trước khi tôi gọi execute(). – Michael