2011-08-22 32 views
6

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

+0

Ứ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

+0

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. –

+0

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

Trả lời

0

Bạn có tạo ra ClientConnectionManager của riêng bạn? Hãy xem source cho AndroidHttpClient.newInstance().

Chúng tạo đối tượng BasicHttpParams mới và chuyển nó tới các hàm tạo cho cả ThreadSafeClientConnectionManager và DefaultHttpClient. Tôi không thấy một cách để thiết lập các tham số trên ClientConnectionManager ngoại trừ trong hàm tạo.

+1

Có, tôi đang mở rộng DefaultHttpClient để tạo HttpClient của riêng tôi, cho phép SSL. Lớp mở rộng ghi đè hàm createClientConnectionManager() và đặt HttpParams như bạn đã nói. Mã tôi liệt kê có thể đặt thời gian chờ kết nối chính xác vì khi tôi tăng thời gian chờ, thời gian tôi phải đợi cho đến khi ngoại lệ được tăng lên cũng tăng tương ứng. Vấn đề duy nhất là thời gian chờ của ổ cắm không bao giờ được nâng lên bất kể giá trị nào tôi thử. –

0

Tôi đang gặp vấn đề tương tự như bạn, với cùng một trường hợp sử dụng. Nó xảy ra trên một thiên hà samsung s2 chạy Android 2.3.6 nhưng không phải với cùng một thiết bị trên 4.x. Thật không may, đây chính xác là thiết bị mà khách hàng của tôi sử dụng và nó chạy tốt trên khoảng 10 thiết bị thử nghiệm khác với các phiên bản Android khác nhau và các nhà xây dựng ...

Tôi đã dành hàng giờ thử với thư viện HttpUrlConnection thay vì HttpClient từ Apache, nhưng kết quả cuối cùng là giống nhau. AndroidHttpClient hiển thị cùng một hành vi. Điều này khiến tôi nói rằng có vẻ như việc triển khai phần cứng hoặc sự cố liên quan đến hệ điều hành ...

Cách giải quyết duy nhất tôi tìm thấy là đặt phương thức HttpClient.execute() trong một chủ đề riêng biệt và gọi thread.join(timeout) để bảo mật. đi sai. Nhược điểm là khi tải lên chạy tốt nhưng mất nhiều thời gian hơn, yêu cầu bị gián đoạn ...

Nếu bạn tìm thấy điều gì đó trong thời gian chờ đợi, tôi sẽ đánh giá cao nếu bạn có thể chia sẻ nó.

Các vấn đề liên quan