it-swarm-vi.com

Vì vậy, phần mềm và phần mềm mạng Android: OkHTTP, Retrofit và Volley

Câu hỏi hai phần từ một nhà phát triển iOS đang học Android, làm việc trong một dự án Android sẽ thực hiện nhiều yêu cầu khác nhau từ JSON đến hình ảnh để tải xuống âm thanh và video:

  1. Trên iOS tôi đã sử dụng rộng rãi AFNetworking dự án. Có thư viện tương đương cho Android không?

  2. Tôi đã đọc trên OkHTTPRetrofit by Square, cũng như Volley nhưng chưa có kinh nghiệm phát triển với chúng. Tôi hy vọng ai đó có thể cung cấp một số ví dụ cụ thể về các trường hợp sử dụng tốt nhất cho từng trường hợp. Từ những gì tôi đã đọc, có vẻ như OkHTTP là mạnh nhất trong ba và có thể xử lý các yêu cầu của dự án này (đã đề cập ở trên).

541
Alfie Hanssen

Tôi hy vọng ai đó có thể cung cấp một số ví dụ cụ thể về các trường hợp sử dụng tốt nhất cho từng trường hợp.

Sử dụng Retrofit nếu bạn đang liên lạc với dịch vụ Web. Sử dụng thư viện ngang hàng Picasso nếu bạn đang tải hình ảnh. Sử dụng OkHTTP nếu bạn cần thực hiện các thao tác HTTP nằm ngoài Retrofit/Picasso.

Volley gần như cạnh tranh với Retrofit + Picasso. Về mặt tích cực, nó là một thư viện. Về mặt trừ, nó là một không có giấy tờ, không được hỗ trợ, "ném mã lên tường và thực hiện thư viện I | O trên đó".

EDIT - Volley hiện được Google hỗ trợ chính thức. Vui lòng tham khảo Hướng dẫn dành cho nhà phát triển của Google

Từ những gì tôi đã đọc, có vẻ như OkHTTP là mạnh nhất trong số 3

Retrofit sử dụng OkHTTP tự động nếu có. Có một Gist từ Jake Wharton kết nối Volley với OkHTTP.

và có thể xử lý các yêu cầu của dự án này (đã đề cập ở trên).

Có lẽ bạn sẽ không sử dụng bất kỳ ứng dụng nào trong số đó để "phát trực tuyến âm thanh và video", theo định nghĩa thông thường là "phát trực tuyến". Thay vào đó, khung phương tiện của Android sẽ xử lý các yêu cầu HTTP đó cho bạn.

Điều đó đang được nói, nếu bạn định thử phát trực tuyến dựa trên HTTP, OkHTTP sẽ xử lý tình huống đó; Tôi không nhớ Volley sẽ xử lý tình huống đó tốt như thế nào. Cả Retrofit và Picasso đều không được thiết kế cho điều đó.

624
CommonsWare

Nhìn vào viễn cảnh của Volley ở đây là một số lợi thế cho yêu cầu của bạn:

Volley, một mặt, hoàn toàn tập trung vào việc xử lý các yêu cầu HTTP nhỏ, riêng lẻ. Vì vậy, nếu việc xử lý yêu cầu HTTP của bạn có một số điểm kỳ quặc, Volley có thể có một cái móc cho bạn. Mặt khác, nếu bạn có một sự giải quyết trong việc xử lý hình ảnh của mình, thì cái móc thực sự duy nhất bạn có là ImageCache. "Không phải là không có gì, nhưng nó cũng không nhiều!" Nhưng nó còn có nhiều ưu điểm khác như Một khi bạn xác định các yêu cầu của mình, sử dụng chúng từ bên trong một đoạn hoặc hoạt động không gây đau đớn không giống như AsyncT task song song

Ưu và nhược điểm của Volley:

Vì vậy, những gì tốt đẹp về Volley?

  • Phần mạng không chỉ dành cho hình ảnh. Volley được dự định là một phần không thể thiếu trong phần cuối của bạn. Đối với một dự án mới dựa trên dịch vụ REST đơn giản, đây có thể là một chiến thắng lớn.

  • NetworkImageView tích cực hơn trong việc dọn dẹp yêu cầu so với Picasso và thận trọng hơn trong các mẫu sử dụng GC của nó. NetworkImageView chỉ dựa vào các tham chiếu bộ nhớ mạnh và dọn sạch tất cả dữ liệu yêu cầu ngay khi yêu cầu mới được đưa ra cho ImageView hoặc ngay khi ImageView di chuyển khỏi màn hình.

  • Hiệu suất. Bài đăng này đã thắng đánh giá tuyên bố này, nhưng rõ ràng họ đã thận trọng để thận trọng trong các mô hình sử dụng bộ nhớ của họ. Volley cũng thực hiện một nỗ lực để gọi lại hàng loạt vào luồng chính để giảm chuyển đổi ngữ cảnh.

  • Volley rõ ràng cũng có tương lai. Hãy xem RequestFuture nếu bạn quan tâm.

  • Nếu bạn xử lý các hình ảnh nén có độ phân giải cao, Volley là giải pháp duy nhất ở đây hoạt động tốt.

  • Volley có thể được sử dụng với Okhttp (Phiên bản mới của Okhttp hỗ trợ NIO để có hiệu suất tốt hơn)

  • Volley chơi Nice với vòng đời Activity.

Vấn đề với Volley:
[.__.] Vì Volley là mới, một số thứ chưa được hỗ trợ, nhưng nó đã được sửa.

  1. Yêu cầu nhiều phần (Giải pháp: https://github.com/vinaysshenoy/enhified-vcar )

  2. mã trạng thái 201 được coi là một lỗi, Mã trạng thái từ 200 đến 207 là phản hồi thành công ngay bây giờ. (Đã sửa: https://github.com/Vinayrraj/CustomVcar )

    Cập nhật:trong bản phát hành mới nhất của Google, lỗi mã Trạng thái 2XX là đã sửangay bây giờ! Cảm ơn Ficus Kirkpatrick!

  3. nó ít tài liệu hơn nhưng nhiều người đang hỗ trợ bóng chuyền trong github, có thể tìm thấy tài liệu giống như Java tại đây . Trên trang web của nhà phát triển Android, bạn có thể tìm thấy hướng dẫn cho Truyền dữ liệu mạng bằng cách sử dụng Volley . Và mã nguồn bóng chuyền có thể được tìm thấy tại Google Git

  4. Để giải quyết/thay đổi Chính sách chuyển hướng của Volley Sử dụng khung Volley với OkHTTP (CommonsWare đã đề cập ở trên)

Ngoài ra, bạn có thể đọc So sánh tải hình ảnh của Volley với Picasso

Trang bị thêm:

Được phát hành bởi Square , Điều này cung cấp rất dễ sử dụng REST API's (Cập nhật: Voila! Với sự hỗ trợ của NIO)

Ưu điểm của trang bị thêm:

  • So với Volley, mã API REST của Retrofit ngắn gọn và cung cấp tài liệu API tuyệt vời và có sự hỗ trợ tốt trong cộng đồng! Nó rất dễ dàng để thêm vào các dự án.

  • Chúng tôi có thể sử dụng nó với bất kỳ thư viện tuần tự hóa, với xử lý lỗi.

Cập nhật:- Có rất nhiều thay đổi rất tốt trong Retrofit 2.0.0-beta2

  • phiên bản 1.6 của Retrofit với OkHttp 2.0 hiện phụ thuộc vào Okiođể hỗ trợ Java.ioJava.nio giúp truy cập, lưu trữ dễ dàng hơn nhiều và xử lý dữ liệu của bạn bằng cách sử dụng ByteStringBộ đệm để thực hiện một số điều thông minh để tiết kiệm CPU và bộ nhớ. (FYI: Điều này nhắc nhở tôi về Koush's OIN thư viện có hỗ trợ NIO!) Chúng tôi có thể sử dụng Trang bị thêm cùng với RxJava để kết hợp và xâu chuỗi REST gọi bằng cách sử dụng rxObservables để tránh chuỗi gọi lại xấu xí (để tránh địa ngục gọi lại !!).

Nhược điểm của Retrofit cho phiên bản 1.6:

  • Chức năng xử lý lỗi liên quan đến bộ nhớ không tốt (trong các phiên bản cũ hơn của Retrofit/OkHttp) không chắc chắn liệu nó có được cải thiện với hỗ trợ Okio với Java NIO hay không.

  • Hỗ trợ luồng tối thiểu có thể dẫn đến gọi lại địa ngục nếu chúng ta sử dụng điều này một cách không phù hợp.

(Tất cả các Nhược điểm trên đã được giải quyết trong phiên bản mới của Retrofit 2.0 beta)

================================================== ======================

Cập nhật:

Điểm chuẩn hiệu suất của Android Async vs Volley vs Retrofit (mili giây, giá trị thấp hơn là tốt hơn) :

Android Async vs Volley vs Retrofit performance benchmarks

(FYI ở trên Thông tin điểm chuẩn Retrofit sẽ cải thiện với hỗ trợ NIO của Java vì phiên bản mới của OKhttp phụ thuộc vào thư viện NIO Okio)

Trong cả ba bài kiểm tra với các lần lặp khác nhau (1 - 25 lần), Volley nhanh hơn từ 50% đến 75%. Trang bị thêm tốc độ nhanh hơn 50% đến 90% so với AsyncT Nhiệm vụ, đạt cùng một điểm cuối cùng số lần. Trên bộ kiểm tra Bảng điều khiển, phần này được dịch thành tải/phân tích dữ liệu nhanh hơn vài giây. Đó là một sự khác biệt lớn trong thế giới thực. Để làm cho các bài kiểm tra công bằng, thời gian cho AsyncT task/Volley đã bao gồm phân tích cú pháp JSON như Retrofit tự động làm điều đó cho bạn.

RetroFit Thắng trong bài kiểm tra điểm chuẩn!

Cuối cùng, chúng tôi quyết định đồng hành cùng Retrofit cho ứng dụng của chúng tôi. Nó không chỉ nhanh một cách lố bịch mà còn kết hợp khá tốt với kiến ​​trúc hiện có của chúng tôi. Chúng tôi đã có thể tạo Giao diện gọi lại gốc tự động thực hiện xử lý lỗi, lưu vào bộ đệm và phân trang mà không cần nhiều nỗ lực cho các API của chúng tôi. Để hợp nhất trong Retrofit, chúng tôi đã phải đổi tên các biến để làm cho các mô hình của chúng tôi tuân thủ GSON, viết một vài giao diện đơn giản, xóa các hàm khỏi API cũ và sửa đổi các đoạn của chúng tôi để không sử dụng AsyncT task. Bây giờ chúng tôi có một vài mảnh được chuyển đổi hoàn toàn, nó khá đau đớn. Có một số khó khăn và vấn đề ngày càng tăng mà chúng tôi phải khắc phục, nhưng nhìn chung nó đã diễn ra suôn sẻ. Ban đầu, chúng tôi gặp phải một số vấn đề/lỗi kỹ thuật, nhưng Square có một cộng đồng Google+ tuyệt vời có thể giúp chúng tôi vượt qua nó.

Khi nào nên sử dụng Volley?!

Chúng tôi có thể sử dụng Volley khi chúng tôi cần tải hình ảnh cũng như tiêu thụ REST API!, Hệ thống xếp hàng cuộc gọi mạng là cần thiết cho nhiều yêu cầu n/w cùng một lúc! cũng là Volley có khả năng xử lý lỗi liên quan đến bộ nhớ tốt hơn so với Retrofit!

OkHttpcó thể được sử dụng với Volley, Retrofit sử dụng OkHttptheo mặc định! Nó có hỗ trợ SPDY của Java NIO với thư viện Okio.

Nguồn, tín dụng: bóng chuyền vs retrofit của ông Josh Ruesch

Lưu ý: Giới thiệu về phát trực tuyến tùy thuộc vào loại phát trực tuyến bạn muốn như RTSP/RTCP.

348
LOG_TAG

RoboSpice Vs. Bóng chuyền

Từ https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ

  • RoboSpice (RS) là dịch vụ dựa trên triết lý và tôn trọng triết lý Android hơn Volley. Volley dựa trên chủ đề và đây không phải là cách xử lý nền nên diễn ra trên Android. Cuối cùng, bạn có thể tìm hiểu cả hai lib và thấy rằng chúng khá giống nhau, nhưng cách xử lý nền của chúng tôi theo định hướng Android hơn, ví dụ, cho phép chúng tôi nói với người dùng rằng RS thực sự đang làm gì đó trong nền, đó sẽ là khó cho bóng chuyền (thực ra nó hoàn toàn không).
  • RoboSpice và bóng chuyền đều cung cấp các tính năng đẹp như ưu tiên, chính sách thử lại, hủy yêu cầu. Nhưng RS cung cấp nhiều hơn: bộ nhớ đệm nâng cao hơn và đó là một bộ đệm lớn, với quản lý bộ đệm, tổng hợp yêu cầu, nhiều tính năng hơn như gửi lại yêu cầu đang chờ xử lý, xử lý hết hạn bộ nhớ cache mà không phụ thuộc vào tiêu đề máy chủ, v.v.
  • RoboSpice thực hiện nhiều hơn bên ngoài UI Thread: bóng chuyền sẽ giải phóng các POJO của bạn trên luồng chính, điều này thật kinh khủng đối với tôi. Với RS, ứng dụng của bạn sẽ phản ứng nhanh hơn.
  • Về tốc độ, chúng tôi chắc chắn cần số liệu. RS đã trở nên siêu nhanh, nhưng chúng ta vẫn chưa có con số để đặt ở đây. Về mặt lý thuyết, Volley sẽ nhanh hơn một chút, nhưng RS hiện đang song song ồ ạt ... ai biết?
  • RoboSpice cung cấp một phạm vi tương thích lớn với các tiện ích mở rộng. Bạn có thể sử dụng nó với okhttp, retrofit, ormlite (beta), jackson, jackson2, gson, xml serializer, google http client, spring Android ... Khá nhiều. Volley có thể được sử dụng với ok http và sử dụng gson. đó là nó.
  • Volley cung cấp nhiều đường UI hơn RS. Volley cung cấp NetworkImageView, RS cung cấp bộ điều hợp spicelist. Về mặt tính năng thì không quá xa, nhưng tôi tin rằng Volley tiên tiến hơn về chủ đề này.
  • Hơn 200 lỗi đã được giải quyết trong RoboSpice kể từ khi phát hành lần đầu. Nó khá mạnh mẽ và được sử dụng nhiều trong sản xuất. Volley kém trưởng thành hơn nhưng cơ sở người dùng của nó sẽ tăng nhanh (hiệu ứng Google).
  • RoboSpice có sẵn trên trung tâm maven. Volley rất khó tìm;)
44
Snicolas

Kết nối mạng cho Android:

Mạng Android nhanhtại đây

Thư viện mạng nhanh Android hỗ trợ tất cả các loại yêu cầu HTTP/HTTPS như GET, POST, DELETE, Head, PUT, PATCH

Thư viện mạng Android nhanh hỗ trợ tải xuống bất kỳ loại tệp nào

Thư viện mạng Android nhanh hỗ trợ tải lên bất kỳ loại tệp nào (hỗ trợ tải lên nhiều phần)

Thư viện mạng Android nhanh hỗ trợ hủy yêu cầu

Thư viện mạng Android nhanh hỗ trợ cài đặt mức độ ưu tiên cho bất kỳ yêu cầu nào (THẤP, TRUNG BÌNH, CAO, NGAY LẬP TỨC)

Thư viện mạng Android nhanh hỗ trợ RxJava

Vì nó sử dụng OkHttp như một lớp kết nối mạng, nó hỗ trợ:

Thư viện mạng Android nhanh hỗ trợ hỗ trợ HTTP/2 cho phép tất cả các yêu cầu đến cùng một Máy chủ để chia sẻ ổ cắm

Thư viện mạng Android nhanh sử dụng nhóm kết nối giúp giảm độ trễ yêu cầu (nếu HTTP/2 không có sẵn)

GZIP trong suốt thu nhỏ kích thước tải xuống

Thư viện mạng nhanh Android hỗ trợ bộ nhớ đệm phản hồi giúp tránh hoàn toàn mạng cho các yêu cầu lặp lại

Cảm ơn: Thư viện được tạo bởi tôi

20
Amit Shekhar

Async HTTP client loopj so với Volley

Các chi tiết cụ thể trong dự án của tôi là các yêu cầu HTTP REST nhỏ, cứ sau 1-5 phút.

Tôi sử dụng máy khách HTTP async (1.4.1) trong một thời gian dài. Hiệu suất tốt hơn so với sử dụng Vanilla Apache httpClient hoặc kết nối URL HTTP. Dù sao, phiên bản mới của thư viện không hoạt động với tôi: thư viện ngoại lệ cắt chuỗi các cuộc gọi lại.

Đọc tất cả các câu trả lời thúc đẩy tôi thử một cái gì đó mới. Tôi đã chọn thư viện Volley HTTP.

Sau khi sử dụng một thời gian, thậm chí không cần kiểm tra, tôi thấy rõ rằng thời gian phản hồi giảm xuống 1,5 lần, gấp 2 lần Volley.

Có lẽ Retrofit tốt hơn máy khách HTTP không đồng bộ? Tôi cần phải thử nó. Nhưng tôi chắc chắn rằng Volley không dành cho tôi.

18
Sergey Vakulenko

Chỉ để thêm một chút vào cuộc thảo luận từ kinh nghiệm của tôi khi làm việc với Volley:

  1. Volley không xử lý tải lên hoặc tải xuống trực tuyến theo bất kỳ ý nghĩa nào. Nghĩa là, toàn bộ phần thân yêu cầu phải nằm trong bộ nhớ và bạn không thể sử dụng OutputStream để ghi phần thân yêu cầu vào ổ cắm bên dưới, bạn cũng không thể sử dụng InputStream để đọc phần thân phản hồi, như cơ bản HttpURLConnection. Vì vậy, Volley là một lựa chọn kém cho việc tải lên hoặc tải xuống các tệp lớn. Yêu cầu và phản hồi của bạn nên nhỏ. Đây là một trong những hạn chế lớn nhất của Volley mà cá nhân tôi gặp phải. Đối với những gì nó có giá trị, OkHttp có giao diện để làm việc với các luồng.

  2. Việc thiếu tài liệu chính thức là khó chịu, mặc dù tôi đã có thể giải quyết vấn đề đó bằng cách đọc mã nguồn, điều này khá dễ thực hiện. Điều khó chịu hơn là, theo như tôi có thể nói, Volley không có phiên bản phát hành chính thức và không có tạo tác Maven hay Gradle, và do đó việc quản lý nó như một sự phụ thuộc trở nên đau đầu hơn, như, bất kỳ thư viện nào Square đã phát hành . Bạn chỉ cần sao chép một repo, xây dựng một cái bình và bạn tự mình làm. Tìm kiếm một sửa lỗi? Lấy và hy vọng nó ở đó. Bạn cũng có thể nhận được một số thứ khác; nó sẽ không được ghi nhận. Theo tôi, điều này có nghĩa là Volley là một thư viện bên thứ 3 không được hỗ trợ, mặc dù cơ sở mã đang hoạt động hợp lý. Emptor caveat.

  3. Là một nit, việc Loại Nội dung được gắn với loại lớp/yêu cầu (JsonObjectRequest, ImageRequest, v.v.) là loại khó xử và làm giảm tính linh hoạt của mã gọi một chút, vì bạn bị ràng buộc với phân cấp loại Yêu cầu hiện có của Volley. Tôi thích sự đơn giản của việc chỉ đặt Loại nội dung làm tiêu đề như mọi tiêu đề khác (nhân tiện, đừng làm điều này với Volley; cuối cùng bạn sẽ có hai tiêu đề Loại nội dung!). Tuy nhiên, đó chỉ là ý kiến ​​cá nhân của tôi và nó có thể được giải quyết.

Điều đó không có nghĩa là Volley không có một số tính năng hữu ích. Nó chắc chắn làm. Chính sách thử lại dễ dàng tùy chỉnh, bộ nhớ đệm trong suốt, API hủy và hỗ trợ lập lịch yêu cầu và kết nối đồng thời là các tính năng tuyệt vời. Chỉ cần biết rằng nó không dành cho tất cả các trường hợp sử dụng HTTP (xem mục 1 ở trên) và có một số vấn đề đau đầu liên quan đến việc đưa Volley vào sử dụng sản xuất trong ứng dụng của bạn (mục 2).

11
Jeff

Gần đây tôi đã tìm thấy một lib được gọi là ion mang lại thêm một chút cho bảng.

ion đã tích hợp hỗ trợ tải xuống hình ảnh được tích hợp với ImageView, JSON (với sự trợ giúp của GSON), các tệp và hỗ trợ phân luồng UI rất tiện dụng.

Tôi đang sử dụng nó cho một dự án mới và cho đến nay kết quả rất tốt. Việc sử dụng của nó đơn giản hơn nhiều so với Volley hoặc Retrofit.

8
Tiago Gaspar

Thêm vào câu trả lời được chấp nhận và những gì LOGiah đã nói .... để Volley phân tích dữ liệu của bạn trong luồng nền, bạn phải phân lớp Request<YourClassName> vì phương thức onResponse được gọi trên luồng chính và phân tích cú pháp trên luồng chính có thể khiến UI bị trễ nếu Phản ứng của bạn là lớn. Đọc ở đây về cách làm điều đó.

4
upenpat

Trang bị thêm 1.9.0 so với RoboSpice

Tôi đang sử dụng cả hai trong ứng dụng của tôi.

Robospice hoạt động nhanh hơn Retrofit mỗi khi tôi phân tích lớp JSON lồng nhau. Bởi vì Spice Manger sẽ làm mọi thứ cho bạn. Trong Retrofit, bạn cần tạo GsonConverter và giải tuần tự hóa nó.

Tôi đã tạo hai đoạn trong cùng một hoạt động và được gọi cùng một lúc với hai loại URL giống nhau.

09-23 20:12:32.830  16002-16002/com.urbanpro.seeker E/RETROFIT﹕   RestAdapter Init
09-23 20:12:32.833  16002-16002/com.urbanpro.seeker E/RETROFIT﹕ calling the method
09-23 20:12:32.837  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ initialzig spice manager
09-23 20:12:32.860  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ Executing the method
09-23 20:12:33.537  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ on SUcceess
09-23 20:12:33.553  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ gettting the all contents
09-23 20:12:33.601  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation starts
09-23 20:12:33.603  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation ends
3
Asthme

Và một tùy chọn khác: https://github.com/apptik/jus

  • Nó là mô-đun như Volley, nhưng mở rộng hơn và tài liệu đang được cải thiện, hỗ trợ các ngăn xếp và bộ chuyển đổi HTTP khác nhau
  • Nó có một mô-đun để tạo ánh xạ giao diện API máy chủ như Retrofit
  • Nó cũng có hỗ trợ JavaRx

Và nhiều tính năng tiện dụng khác như bút đánh dấu, máy biến thế, v.v.

2
djodjo