2011-01-25 28 views
51

Tôi cần tải xuống một trang web trên ứng dụng android và tôi đang gặp khó khăn khi quyết định có nên sử dụng ứng dụng khách Apache apache của Android hay URLConnection của java hay không.Ứng dụng khách Apache http hoặc URLConnection của Apache

Mọi suy nghĩ?

+0

2015 Cập nhật: Hiện tại, các lớp Android M., org.apache.http đã bị xóa khỏi SDK. Đây là lưu ý phát hành chính thức: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client –

Trả lời

25

Đối với hầu hết những điều tôi muốn nói rằng HttpClient là cách để thực hiện. Tuy nhiên có một số tình huống và trường hợp cạnh mà tôi muốn quay trở lại một URLConnection. Ví dụ về các trường hợp cạnh herehere

EDIT
Một câu hỏi tương tự đã được hỏi trước: httpclient vs httpurlconnection. Tôi giả định rằng HttpUrlConnection là hơi nhanh hơn khi HttpClient được xây dựng trên đầu trang của các thư viện Java chuẩn. Tuy nhiên Tôi sẽ tìm thấy mã số HttpClient nhanh hơn và dễ dàng hơn để viết và duy trì. Theo nhận xét bên dưới, các yếu tố cốt lõi của HttpClient đã được tối ưu hóa hiệu suất.

Nếu hiệu suất là mối quan tâm chính, đặt cược tốt nhất của bạn là viết hai khách hàng, một bằng cách sử dụng từng phương pháp, sau đó đánh giá cả hai phương pháp đó. Nếu bạn làm điều này, vui lòng cho chúng tôi biết kết quả.

+0

Bạn có ý tưởng nào về người nhanh hơn không? –

+0

Đã chỉnh sửa câu trả lời của tôi để thêm một số thông tin khác –

+1

HttpClient 4.1 phải là _significantly_ nhanh hơn HttpUrlConnection. Xem http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore. Chỉ HttpCore đơn giản là nhanh hơn HttpClient trong các bài kiểm tra của tôi – oleg

14

trong Gingerbread trở lên, HttpURLConnection là cách để thực hiện. xem xét Apache HttpClient không được chấp nhận. (Cũng lưu ý rằng Android không sử dụng HttpClient 4.1, đề cập trong bình luận khác.)

nếu bạn có một trường hợp Apache HttpClient là nhanh hơn, báo cáo nó như là một lỗi ở đây: http://code.google.com/p/android/issues/list

+1

Thật sao? Tại sao? Các bạn có tuyên bố điều này ở đâu không? Tôi đã nghĩ rằng nó thường được đồng ý rằng Apache HttpClient là API đẹp hơn để sử dụng. –

+8

Hughes: Bản thân Google đã nói với chúng tôi lần cuối I | O ngược lại, chúng ta nên sử dụng HttpClient và không sử dụng 'HttpUrlConnection'. Và, kể từ lần cuối cùng tôi nhìn, 'HttpURLConnection' được triển khai thông qua HttpClient. Điều này thực sự khá quan trọng, và do đó, sẽ thật tuyệt nếu chúng ta có thể công khai hóa điều này nhiều hơn một chút nếu đây thực sự là hướng mà Google muốn chúng ta hướng đến. – CommonsWare

+2

@CommonsWare Nó đã được công bố chỉ gần đây ở đây: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. '[HttpClient] thực hiện là ổn định và họ có vài lỗi. Nhưng kích thước lớn của API này khiến chúng tôi khó có thể cải thiện nó mà không phá vỡ tính tương thích. Nhóm Android không chủ động làm việc trên Apache HTTP Client.' OMG. Tôi nhớ làm thế nào oleg [cố gắng để đồng bộ hóa] (http://old.nabble.com/HttpClient-in-Android-ts27915358.html) tiếp tục phát triển dự án với nhóm Android. Và bây giờ họ quyết định không dùng HttpClient nữa - đó là một sự xấu hổ thật sự. – Idolon

43

Google đã âm thầm phản đối Apache Sử dụng ứng dụng khách HTTP từ Gingerbread: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. Và mặc dù họ không đánh dấu chú thích bằng chú thích không dùng nữa, họ khuyên bạn nên sử dụng HttpURLConnection cho các ứng dụng mới dưới dạng: it is where we [Google] will be spending our energy going forward.

Cá nhân tôi không thích quyết định đó và muốn dính vào HttpClient 4.1+, vì nó nhanh hơn, có ít lỗi hơn và được cập nhật thường xuyên. Và trong khi bạn không thể nâng cấp thư viện hệ thống lên phiên bản 4.1, bạn có thể bao gồm bình HttpClient cho dự án Android của mình (vì lợi ích bổ sung này sẽ cho phép bạn không phụ thuộc vào các bản sửa lỗi và bản cập nhật của nhà cung cấp Google). Tuy nhiên, có một lỗ hổng: để ngăn chặn các xung đột có thể xảy ra với thư viện tích hợp, bạn nên đổi tên các gói httpclient bằng công cụ JarJar. Hóa ra ai đó đã làm điều này (repackaged jar và dự án thư viện Android có sẵn để tải về):

http://code.google.com/p/httpclientandroidlib/

Đây là một đóng gói lại của HttpClient 4.1 dành cho Android. Phiên bản HttpClient trong SDK Android là 4.0beta2. Đã có một số cập nhật cho HttpClient và một số sửa lỗi rất cần thiết như auth caching kể từ 4.0beta.

Vì Google đã từ chối HttpClient theo tiêu chuẩn Java HttpURLConnection Tôi đã tạo tập lệnh để chuyển đổi bản phát hành cổ phiếu HttpClient của Apache vào thư viện Android.

Thay đổi dự trữ HttpClient

  • đổi tên tất cả các gói org.apache.http để ch.boye.httpclientandroidlib
  • xóa tất cả các lớp học phụ thuộc vào org.ietf. * (Spnego xác thực)
  • thay thế org.apache.commons.codec.binary.Base64 với android.util.Base64
  • Tạo một lớp mới HttpClientAndroidLog để thay thế org .apache.commons.logging
+0

Xin chào, tôi đang sử dụng thư viện của bạn ngay bây giờ để tải lên tệp bằng MultipartEntity Builder và HttpEntity. Nhưng tôi lo ngại nếu thư viện vẫn còn phù hợp với 22 thiết bị trở lên. –

+0

@John Trước hết, đó không phải là thư viện của tôi, vì tôi chưa bao giờ đóng góp cho dự án đó. Thứ hai, câu trả lời này là 4 tuổi và thư viện dường như không được cập nhật cho đến đầu năm 2014 và chứa các lỗ hổng đã được sửa trong các phiên bản mới nhất của HttpClient (xem https://code.google.com/p/httpclientandroidlib/ vấn đề/chi tiết? id = 19).Tôi sẽ sớm cập nhật câu trả lời của tôi, cho đến lúc đó tôi đề nghị bạn sử dụng một trong các cách sau: https://hc.apache.org/httpcomponents-client-4.5.x/android-port.html hoặc chuyển sang ứng dụng khách OkHttp: http: //square.github.io/okhttp/ – Idolon

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