So sánh các thư viện mạng Android: OkHTTP, Retrofit và Volley [đã đóng]


579

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 dự án AFNetworking . Có thư viện tương đương cho Android không?

  2. Tôi đã đọc trên OkHTTPRetrofit của Square, cũng như Volley nhưng chưa có kinh nghiệm phát triển với họ. 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).


3
Nếu bạn đang sử dụng triển khai nội bộ của HttpUrlConnection, bạn nên xem xét rằng HTTPUrlConnection sử dụng thử lại im lặng trên các yêu cầu POST. Điều đó gây ra rất nhiều thiệt hại cho tôi. Để biết thêm thông tin đọc tại đây: stackoverflow.com/a/37675253/2061089
oli

1
nếu bất kỳ ai cần danh sách tất cả các thư viện mạng, bạn có thể tìm thấy nó trên bài đăng trên blog của tôi androidredman.wordpress.com/2017/06/26/ Kẻ
Manohar Reddy

Volley có thể chạy các di sản Apache, HttpUrlConnection, Apache-4 hoặc OkHttp. Trường hợp Retrofit thực sự chỉ chạy OkHttp. Retrofit dễ dàng hơn rất nhiều để cấu hình.
bitsabhi

Câu trả lời:


647

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 thư viện không có giấy tờ, không được hỗ trợ, "ném mã lên tường và làm một bài thuyết trình 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

Trang bị thêm 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 tải xuống â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 đó.


4
Cảm ơn @CommonsWare cho câu trả lời ngắn gọn và ghi chú về steez không có giấy tờ của Volley (có ấn tượng đó, đặc biệt so với các dự án khác). Chắc chắn giúp tôi có được những thứ trên mặt đất.
Alfie Hanssen

18
Một câu trả lời tuyệt vời khác từ @CommonsWare. Ai đó có thể theo dõi làm thế nào RoboSpice phù hợp với tất cả những điều này?
dùng1923613

3
@ user1923613 github.com/octo-online/robospice nếu bạn đang sử dụng bóng chuyền cho các cuộc gọi mạng thì không cần sử dụng robospice!, bóng chuyền có rất nhiều điều mà Robospice thực hiện cho các cuộc gọi mạng, Robospice hỗ trợ REST ra khỏi hộp Spring Android hoặc Google http Client hoặc Retrofit). Nếu bạn muốn kết nối mạng nhanh và tải hình ảnh với ứng dụng khách mạng mạnh mẽ, bạn có thể đi bóng chuyền! nhưng bạn có thể thay thế tác vụ không đồng bộ Android thông thường mà bạn sử dụng Robospice để có hiệu suất tốt hơn và tránh rò rỉ bộ nhớ!
LOGiah

4
@frostymarvelous: Tôi cảm thấy rằng không có giấy tờ và không được hỗ trợ là quá đủ để biện minh. Không giống như Google thiếu một hệ thống để xử lý chính thức hơn những thứ như thế này (ví dụ: Thư viện hỗ trợ Android). Trong hai năm kể từ câu trả lời này, về mặt tích cực, có một số lượng hỗ trợ cộng đồng, bao gồm cả một số bao bì không chính thức của mã thành một vật phẩm.
CommonsWare

4
@AbhinavVutukuri: Bạn đang bình luận về một câu trả lời từ hơn hai năm trước. Vào thời điểm đó, không có tài liệu.
CommonsWare

361

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ó nhiều ưu điểm khác như Khi bạn xác định 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 hoàn toàn 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 sẽ không đánh giá khiếu nại này, nhưng rõ ràng họ đã cẩn thận để thận trọng trong các mẫu sử dụng bộ nhớ của mình. Volley cũng thực hiện một nỗ lực để gọi lại hàng loạt đến 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 đang 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 đẹp với vòng đời Activity.

Các vấn đề với Volley:
Vì Volley là mới, một số điều 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 bóng chuyền, lỗi mã trạng thái 2XX đã được khắc phục ngay 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, java giống như tài liệu có thể được tìm thấy ở đâ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 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 khung Volley, hãy sử dụng Volley với OkHTTP (CommonsWare đã đề cập ở trên)

Ngoài ra, bạn có thể đọc phần tải hình ảnh của Volley này 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 API REST (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ữ và xử lý dữ liệu của bạn dễ dàng hơn bằng cách sử dụng ByteStringBuffer để 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 làm tôi nhớ đến thư viện OIN của Koush với sự hỗ trợ của NIO!) Chúng tôi có thể sử dụng Retrofit cùng với RxJava để kết hợp và xâu chuỗi các cuộc gọi REST bằng rxObservables để tránh các chuỗi gọi lại xấu xí (để tránh địa ngục gọi lại xấu xí !!) .

Nhược điểm của trang bị thêm 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 Retrofit 2.0 beta mới)

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

Cập nhật:

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

Điểm chuẩn hiệu năng của Android Async vs Volley vs Retrofit

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

Trong cả ba thử nghiệm 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 đ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 cho phụ huynh, tự động thực hiện xử lý lỗi, 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 của mình để 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ông gây đau đớn. Có một số khó khăn ngày càng tăng và các vấn đề 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ụ API REST!, 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! Ngoài ra, Volley có khả năng xử lý lỗi liên quan đến bộ nhớ tốt hơn so với Retrofit!

OkHttp có thể được sử dụng với Volley, Retrofit sử dụng OkHttp theo mặc định! Nó có hỗ trợ SPDY , tổng hợp kết nối, lưu trữ đĩa, nén trong suốt! Gần đây, nó đã nhận được một số hỗ trợ của java NIO với thư viện Okio .

Nguồn, tín dụng: bóng chuyền vs trang bị thêm bởi ông Josh Ruesch

Lưu ý: Về phát trực tuyến, nó phụ thuộc vào loại phát trực tuyến bạn muốn như RTSP / RTCP.


@ Jan1337z +1 để biết thông tin! Tôi đã cập nhật nó! android.googlesource.com/pl
platform / frameworks / xe đẩy

4
@LOGiah sẽ rất thú vị khi đánh giá RoboSpice trong mẫu của bạn. Chúng tôi thậm chí còn cung cấp một mô-đun Retrofit vì vậy tôi tin rằng điều này sẽ đòi hỏi rất ít thay đổi. Là nguồn có sẵn ở đâu đó? Ưu điểm của RS là xử lý đúng vòng đời của hoạt động thực hiện các yêu cầu mạng và chúng tôi cũng cung cấp bộ nhớ đệm trong suốt, tôi đoán rằng chi phí sẽ nhỏ so với yêu cầu trang bị thêm thuần túy.
Snicolas

@Snicolas Tôi đã nhận được kết quả điểm chuẩn này bởi blog Josh Ruesch, bạn có thể thấy sự chuyển đổi giữa Ficus Kirkpatrick (người sáng lập Volley), Josh Ruesch! Anh chưa chia sẻ dự án kiểm tra điểm chuẩn ở bất cứ đâu! FYI Tôi mới bắt đầu học RoboSpice của bạn với mẫu trang bị thêm phải đối mặt với vấn đề thông báo này :)
LOGiah

3
Chào! Về Yêu cầu nhiều phần với Volley, tôi nghĩ rằng chúng ta có thể sử dụng MultipartEntityBuildertrong httpmimethư viện với nó.
BNK

2
Có ai khác xác minh các điểm chuẩn? Vì thư viện apache http không được dùng trong M (và tôi đang sử dụng nó cho trình xây dựng nhiều phần), tôi đã quyết định chuyển mã mạng của mình sang Retrofit. Ban đầu tôi đã thay đổi một trong các lệnh gọi GET để nhận một loạt các đối tượng từ máy chủ. Tôi đã hẹn giờ Retrofit vs AsyncTask (với phân tích cú pháp JSON của riêng tôi). Hiệu suất rất gần, không phải là một cải tiến 3x như được hiển thị trong cột "Một cuộc thảo luận" của bảng. Cấp, mã kết quả sạch hơn nhiều và tôi không phải viết trình phân tích cú pháp JSON của riêng mình, nhưng đối với một yêu cầu GET duy nhất, sự cải tiến không có ở đó.
Gary Kipni

44

RoboSpice Vs. 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ể đào sâ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 hay 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ố nào để đặ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;)

Robospice sử dụng các dịch vụ Android cho cuộc gọi REST, chúng ta có thể sử dụng Robospice với Retrofit để giảm thiểu các nỗ lực phân tích cú pháp gson, giống như cách chúng ta có thể sử dụng Volley (dựa trên bước đi) với Robospice? (không chắc đó là qsn đúng để hỏi) Tôi chỉ tìm kiếm bóng chuyền với dịch vụ!
LOGiah

1
Volley với dịch vụ về cơ bản là RS. Hay nói theo trình tự thời gian, Volley là RS không có dịch vụ và thiếu một số tính năng khác. Và vâng, bạn có thể sử dụng Retrofit với RS, và thậm chí thêm okhttp nếu bạn thích.
Snicolas

7
Tại sao bóng chuyền khó tìm? compile 'com.mcxiaoke.volley:library:1.0.+'
Cướp

1
@Rob đã có lúc bản sao của mcxiaoke không có sẵn. Bạn phải tự đưa bóng chuyền vào ứng dụng của mình.
frostymarvelous

"Bóng chuyền sẽ khử lưu lượng POJO của bạn trên luồng chính". Bạn có thể nhận dữ liệu JSON được trả về và tự giải tuần tự hóa nó trên một luồng riêng nếu đây là một vấn đề.
AndroidDev

20

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

Mạng Android nhanhở đâ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 khả dụng)

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


1
Bạn nói rằng thư viện của bạn hỗ trợ HTTP / 2, nhưng bạn không nói nếu có yêu cầu API cho hỗ trợ HTTP / 2. Tôi hiểu rằng cấp API Android dưới 5.0 không có các phương thức mã hóa SSL phù hợp để hỗ trợ HTTP / 2. Không gõ cửa, chỉ cố gắng để đánh giá đầy đủ giải pháp đề xuất của bạn.
Bác sĩ

@AmitShekhar: Tôi chỉ muốn biết rằng cái nào là tốt nhất để gọi API trong Android. Tôi đang sử dụng Thư viện mạng Android, vậy việc triển khai Retrofit, Volley hay Android là gì?
Parth Bhayani

@Amit Shekhar Mạng Android nhanh hiệu quả như thế nào để tải lên nhiều hình ảnh, đặc biệt là khi nói đến các tình huống internet thấp?
dùng3135923

18

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 còn 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.


Bất kỳ phân tích về Retrofit Vs AsyncHttpClient ??? Vui lòng gửi nếu có @Sergey
IshRoid


Tôi đang sử dụng AsyncHttpClient trong một vài năm. Điều tồi tệ là có repo github là 2 năm không có cam kết.
Vitor Hugo Schwaab

Nó không thực tế nữa, async http là quá cũ. Xem xét để thay đổi sang thư viện khác. Volley cũng trở thành sự lựa chọn rất tốt.
Serge Vakulenko

Sergey, @IshRoid tôi vẫn đang tìm kiếm để trả lời câu hỏi của bạn tôi đang sử dụng AsyncHttpClient tôi nên sử dụng cái gì khác như RxJava Retrofit hoặc bất cứ điều else..Please cho tôi biết .. háo hức chờ đợi phản ứng
Sâu Dave

11

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 phần thân 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 phần tử 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 không 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 yêu cầu / lớp (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 hệ thống 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).


Tải bộ nhớ đầy đủ là những gì tôi dần giết chết tôi. Cảm ơn chúa, người khác đã đề cập đến nó.
TheSunny

Thư viện cũng có thể tạo một bản sao phòng thủ của cơ thể yêu cầu của bạn, vì vậy mức tiêu thụ bộ nhớ cho các yêu cầu lớn có thể gấp đôi những gì bạn có thể mong đợi.
Jeff

9

Gần đây tôi đã tìm thấy một lib gọi là ion mang thêm một chút vào bàn.

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.


2
ion vs retrofit, bạn muốn giới thiệu cái nào?
Saletanth Karumanaghat

Retrofit tốt hơn ion
Rajesh Koshti 8/11/2016

4

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 một luồng nền, bạn phải phân lớp Request<YourClassName>onResponsephương thức đượ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 hồi của bạn là lớn Đọc ở đây về cách để làm điều đó.


1
đúng ... bóng chuyền phân tích phản hồi trên luồng chính khiến cho ui bị trễ khi phản hồi thực sự lớn.
Gopal Singh Sirvi

3

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

2

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 ra khỏi hộp
  • 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.