Porównanie bibliotek sieciowych Androida: OkHTTP, Retrofit i Volley [zamknięte]

Dwuczęściowe pytanie od programisty iOS uczącego się Androida, pracującego nad projektem Android, który będzie wysyłał różne żądania od JSON do obrazu w celu przesyłania strumieniowego pobierania audio i wideo:

  1. Na iOS korzystałem szeroko z projektu AFNetworking . Czy istnieje równoważna biblioteka dla Androida?

  2. Czytałem o OkHTTP i Retrofit by Square, a także Volley, ale nie mam jeszcze doświadczenia w rozwijaniu się z nimi. Mam nadzieję, że ktoś może podać konkretne przykłady najlepszych przypadków użycia dla każdego. Z tego, co czytałem, wydaje się, że OkHTTP jest najbardziej solidnym z trzech i może obsłużyć wymagania tego projektu (wspomniano powyżej).

Author: Peter Mortensen, 2013-06-03

10 answers

Mam nadzieję, że ktoś może podać konkretne przykłady najlepszych przypadków użycia dla każdego.

Użyj Retrofit, jeśli komunikujesz się z usługą internetową. Użyj biblioteki peer Picasso, jeśli pobierasz obrazy. Użyj OkHTTP, jeśli chcesz wykonywać operacje HTTP, które leżą poza Retrofit / Picasso.

Volley z grubsza konkuruje z Retrofit + Picasso. Plusem jest jedna biblioteka. Po stronie minusowej jest to jeden nieudokumentowany, nieobsługiwany, " rzuć kod przez ścianę i zrobić na niej prezentację We|Wy " biblioteka.

Edycja-Volley jest teraz oficjalnie wspierana przez Google. Uprzejmie zapoznaj się z Google Developer Guide

Z tego co czytałem, wydaje się, że OkHTTP jest najbardziej wytrzymały z 3

Modernizacja wykorzystuje OkHTTP automatycznie, jeśli jest dostępna. Istnieje Gist od Jake Wharton , który łączy Volley z OkHTTP.

I może obsłużyć wymagania tego projektu (wymienione powyżej).

Prawdopodobnie nie użyjesz żadnego z nich do "streamingowego pobierania audio i wideo", zgodnie z konwencjonalną definicją"streaming". Zamiast tego platforma multimedialna Androida obsłuży te żądania HTTP.

To powiedziawszy, jeśli masz zamiar próbować zrobić własny streaming oparty na HTTP, OkHTTP powinien obsłużyć ten scenariusz; nie przypominam sobie, jak dobrze Volley poradziłby sobie z tym scenariuszem. Ani Retrofit, ani Picasso nie są do tego przeznaczone.

 611
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 09:00:27

Patrząc z perspektywy Volley oto kilka zalet dla Twoich wymagań:

Volley z jednej strony całkowicie koncentruje się na obsłudze pojedynczych, małych żądań HTTP. Więc jeśli obsługa żądań HTTP ma jakieś dziwactwa, Volley prawdopodobnie ma dla Ciebie Hooka. Z drugiej strony, jeśli masz dziwactwo w obsłudze obrazów, jedynym prawdziwym Hookiem jest ImageCache . "To nie jest nic, ale to nie jest dużo!, albo". ale ma więcej innych zalet, takich jak po zdefiniowaniu swojego żądania, używanie ich z fragmentu lub aktywności jest bezbolesne, w przeciwieństwie do równoległych asynchronicznych Zadań

Plusy i minusy siatkówki:

Więc co jest miłego w Volley?

  • Część networkingowa Nie dotyczy tylko obrazów. Volley ma być integralną częścią twojego zaplecza. Dla nowego projektu opartego na prosta obsługa odpoczynku, to może być duża wygrana.

  • NetworkImageView jest bardziej agresywny w kwestii czyszczenia żądań niż Picasso i nie tylko konserwatywny w swoich wzorcach użytkowania GC. NetworkImageView opiera się wyłącznie na silnych odniesieniach do pamięci i czyści wszystkie dane żądania, gdy tylko zostanie złożone nowe żądanie ImageView lub gdy tylko ImageView przesunie się poza ekran.

  • Wydajność. Ten post nie oceni tego twierdzenia, ale wyraźnie zadbano o rozsądne wzorce wykorzystania pamięci. Volley dokłada również starań, aby wsadowe wywołania zwrotne do głównego wątku do zmniejsz kontekst przełączam się.

  • Volley najwyraźniej też ma przyszłość. Sprawdź RequestFuture jeśli jesteś zainteresowany.

  • Jeśli masz do czynienia ze skompresowanymi obrazami o wysokiej rozdzielczości, to jedyne rozwiązanie tutaj, które działa dobrze.

  • Volley może być używany z Okhttp (nowa wersja Okhttp obsługuje NIO dla lepszej wydajności)

  • Volley gra ładnie z cyklu życia aktywności.

Problemy Z Siatkówką:
Ponieważ Volley jest nowe, kilka rzeczy nie są jeszcze obsługiwane, ale to jest naprawione.

  1. Multipart Requests (rozwiązanie: https://github.com/vinaysshenoy/enhanced-volley)

  2. Kod statusu 201 jest traktowany jako błąd, kod statusu Od 200 do 207 jest teraz pomyślną odpowiedzią.(Fixed: https://github.com/Vinayrraj/CustomVolley )

    Update: w najnowszej wersji Google volley, błąd kodów statusu 2XX jest Poprawiono Teraz!Dzięki Ficus Kirkpatrick!

  3. Jest to mniej udokumentowane, ale wiele osób wspiera volley w GitHubie, dokumentację podobną do Javy można znaleźć tutaj . Na stronie dewelopera Androida można znaleźć przewodnik przesyłania danych sieciowych za pomocą Volley . A kod źródłowy można znaleźć na Google Git

  4. Aby rozwiązać / zmienić przekierować Politykę Volley Framework użyj Volley z OkHTTP (CommonsWare wymienione powyżej)

Możesz też przeczytać to porównując ładowanie zdjęć z Picassem

Retrofit:

Jest wydany przez Square , oferuje bardzo łatwy w użyciu REST API (aktualizacja: Voila! z obsługą NIO)

Zalety modernizacji:

  • W porównaniu do Volley, Kod REST API Retrofit jest krótki i zapewnia doskonała Dokumentacja API i ma dobre wsparcie w społecznościach! Bardzo łatwo jest dodać do projekty.

  • Możemy go używać z dowolną biblioteką serializacji, z obsługą błędów.

Update: - Jest wiele bardzo dobrych zmian w Retrofit 2.0.0-beta2

  • Wersja 1.6 modernizacji z OkHttp 2.0 jest teraz zależna od Okio do obsługi java.io i java.nio co znacznie ułatwia dostęp, przechowywanie i przetwarzanie danych za pomocą ByteString i bufora do zrób kilka sprytnych rzeczy, aby zapisać procesor i pamięć. (FYI: to przypomina mi } OIN biblioteki Koush z obsługą NIO!) Możemy użyć modernizacja wraz z RxJava aby połączyć i połączyć połączenia REST używając rxObservables aby uniknąć brzydkich łańcuchów callback (aby uniknąć callback hell!!).

Wady modernizacji wersji 1.6:

  • Funkcjonalność obsługi błędów związanych z pamięcią nie jest dobra (w starszych wersje Retrofit/OkHttp) Nie wiem, czy jest to poprawione z Okio z obsługą Java NIO.

  • Minimalna pomoc gwintowania może spowodować wywołanie piekła, jeśli użyjemy tego w niewłaściwy sposób.

(wszystkie powyższe wady zostały rozwiązane w nowej wersji Retrofit 2.0 beta)

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

Update:

Android Async vs Volley vs Retrofit performance benchmarks (milisekundy, niższa wartość jest lepsza):

Android Async vs Volley vs Retrofit performance benchmarks

(FYI above Retrofit Benchmarki info poprawi się z obsługą java NIO ponieważ nowa wersja OKhttp jest zależna od biblioteki NIO Okio)

We wszystkich trzech testach z różnymi powtórzeniami (1 – 25 razy), Volley był od 50% do 75% szybciej. Modernizacja taktowana w imponującym 50% do 90% szybciej niż asynchroniczne zadania, uderzając w ten sam punkt końcowy tyle samo razy. Na Dashboard Test suite, to przetłumaczone do ładowania/parsowania danych o kilka sekund szybciej. To jest ogromna różnica w świecie rzeczywistym. Aby testy były sprawiedliwe, czasy dla AsyncTasks / Volley włączone parsowanie JSON jak modernizacja robi to dla ciebie automatycznie.

Modernizacja wygrywa w teście benchmarkowym!

Ostatecznie zdecydowaliśmy się na modernizację naszej aplikacji. Nie tylko jest śmiesznie szybki, ale całkiem dobrze łączy się z naszym istniejące Architektura. Udało nam się wywołać rodzica Interfejs, który automatycznie wykonuje obsługę błędów, buforowanie i paginacja z niewielkim lub żadnym wysiłkiem dla naszych API. Aby połączyć się w Modernizacja, musieliśmy zmienić nazwy naszych zmiennych, aby nasze modele GSON zgodny, napisać kilka prostych interfejsów, usunąć funkcje z stare API i zmodyfikować nasze fragmenty, aby nie używać asynchronicznych Zadań. Teraz, gdy my mają kilka fragmentów całkowicie przekształcone, to dość bezbolesne. Tam czy niektóre rosły bóle i problemy, które musieliśmy przezwyciężyć, ale ogólnie poszło gładko. Na początku natknęliśmy się na kilka problemy techniczne/błędy, ale Square ma fantastyczną społeczność Google+ to nam pomogło.

Kiedy stosować Volley?!

Możemy użyć Volley, gdy musimy załadować obrazy, a także zużywać REST API!, system kolejkowania połączeń sieciowych jest potrzebny dla wielu żądań n / w jednocześnie! również ma lepszą obsługę błędów związanych z pamięcią niż Modernizacja!

OkHttp może być używany z Volley, domyślnie używa OkHttp! Posiada SPDY wsparcie, pooling połączeń, buforowanie dysku, przezroczysta kompresja! Od niedawna posiada pewne wsparcie dla java NIO z Okio biblioteka.

Źródło, kredyt: volley-vs-retrofit Autor: Josh Ruesch

Uwaga: o streamingu to zależy od tego, jaki rodzaj streamingu chcesz jak RTSP / RTCP.

 335
Author: LOG_TAG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 08:05:15

RoboSpice Vs. Volley

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

    RoboSpice (RS) jest oparty na usługach i bardziej szanuje filozofię Androida niż Volley. Volley jest oparty na wątkach i nie jest to sposób, w jaki przetwarzanie tła powinno odbywać się na Androidzie. Ostatecznie, można wykopać oba libs i znaleźć, że są one bardzo podobne, ale nasz sposób na przetwarzanie w tle jest bardziej zorientowany na Androida, pozwala nam, na przykład, powiedzieć użytkownikom, że RS faktycznie robi coś w tle, co byłoby dla nich trudne (właściwie wcale nie).
  • RoboSpice i volley oferują ładne funkcje, takie jak ustalanie priorytetów, ponawianie zasad, anulowanie żądania. Ale RS oferuje więcej : bardziej zaawansowane buforowanie i to jest duże, z zarządzaniem pamięcią podręczną, agregacją żądań, więcej funkcji, takich jak repluging do oczekującego żądania, radzenie sobie z wygaśnięciem pamięci podręcznej bez polegania na nagłówkach serwera, itp.
  • RoboSpice robi więcej poza wątkiem UI: volley deserialize swoje Pojo w głównym wątku, co jest straszne dla mnie. Dzięki RS Twoja aplikacja będzie bardziej responsywna. Jeśli chodzi o szybkość, zdecydowanie potrzebujemy metryki. RS stał się teraz super szybki, ale nadal nie mamy figury, aby umieścić tutaj. Wolej teoretycznie powinien być nieco szybszy, ale RS jest teraz masowo równoległy... kto wie ? RoboSpice oferuje szeroki zakres kompatybilności z rozszerzeniami. Możesz go używać z okhttp, retrofit, ormlite( beta), jackson, jackson2, GSON, XML serializer, klient http google, spring android... Całkiem sporo. Volley może być używany z ok http i używa gson. to wszystko.
  • Volley oferuje więcej UI cukru, że RS. Volley zapewnia NetworkImageView, RS zapewnia adapter spicelist. Jeśli chodzi o fabułę to na razie nie, ale uważam, że Volley jest bardziej zaawansowany w tym temacie.
  • [9]}ponad 200 błędów zostało rozwiązanych w RoboSpice od czasu jego pierwszego wydania. Jest dość wytrzymały i mocno używany w produkcji. Volley jest mniej dojrzały, ale jego baza użytkowników powinna szybko rosnąć(efekt Google). RoboSpice jest dostępny na maven central. Volley trudno znaleźć;)
 42
Author: Snicolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 22:14:03

Async HTTP client loopj vs Volley

Specyfiką mojego projektu są małe żądania HTTP REST, co 1-5 minut.

Używam klienta HTTP asynchronicznego (1.4.1) od dłuższego czasu. Wydajność jest lepsza niż przy użyciu vanilla Apache httpClient lub połączenia HTTP URL. W każdym razie nowa wersja biblioteki nie działa dla mnie: library inter exception cut chain of callbacks.

Czytanie wszystkich odpowiedzi zmotywowało mnie do spróbowania czegoś nowego. Wybrałem Biblioteka Volley HTTP.

Po dłuższym użytkowaniu, nawet bez testów, widzę wyraźnie, że czas reakcji spada do 1,5 x, 2x.

Może Retrofit jest lepszy od klienta HTTP asynchronicznego? Muszę spróbować. Ale jestem pewien, że Salwa nie jest dla mnie.

 17
Author: Sergey Vakulenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:52:44

AFNetworking dla Androida:

Szybka sieć Android jest TUTAJ

Szybka Biblioteka sieci Android obsługuje wszystkie typy żądań HTTP / HTTPS, takie jak GET, POST, DELETE, HEAD, PUT, PATCH

Szybka Biblioteka sieciowa Android obsługuje pobieranie dowolnego typu pliku

Szybka Biblioteka sieciowa Android obsługuje przesyłanie dowolnego typu plików (obsługuje przesyłanie wieloczęściowe)

Szybka Biblioteka sieciowa Android obsługuje anulowanie żądania

Fast Biblioteka sieciowa systemu Android obsługuje ustawianie priorytetu dowolnego żądania (niski, średni, wysoki, natychmiastowy)

Szybka Biblioteka sieciowa Android obsługuje RxJava

Ponieważ używa OkHttp jako warstwy sieciowej, obsługuje:

Szybka Biblioteka sieci Android obsługuje obsługę HTTP / 2 pozwala wszystkim żądaniom do tego samego hosta na współdzielenie gniazda

Fast Android Networking Library wykorzystuje pooling połączeń, co zmniejsza opóźnienia żądań (jeśli HTTP/2 nie jest dostępny)

Przezroczysty GZIP shrinks download sizes

Szybka Biblioteka sieciowa Androida obsługuje buforowanie odpowiedzi, które całkowicie unika sieci dla powtarzających się żądań

Thanks: the library is created by me

 17
Author: Amit Shekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:53:32

Aby dodać trochę do dyskusji z mojego doświadczenia w pracy z Volley:

  1. Volley nie obsługuje przesyłania strumieniowego ani pobierania w żadnym sensie. Oznacza to, że całe ciało żądania musi być w pamięci i nie można użyć OutputStream do napisania ciała żądania do gniazda bazowego, ani nie można użyć InputStream do odczytania ciała odpowiedzi, tak jak robi to basic HttpURLConnection. Tak więc, Volley jest słabym wyborem do przesyłania lub pobierania dużych plików. Twoje prośby i odpowiedzi powinny być małe. To jest jednym z największych ograniczeń Volley, które osobiście spotkałem. Jeśli to coś warte, OkHttp ma interfejsy do pracy ze strumieniami.

  2. Brak oficjalnej dokumentacji jest irytujący, chociaż udało mi się to obejść, czytając kod źródłowy, który jest dość łatwy do naśladowania. Co bardziej uciążliwe jest to, że, o ile mogę powiedzieć, Volley nie ma oficjalnych wersji wydania i nie ma Mavena lub Gradle artifact, a zatem zarządzanie nim jako zależnością staje się bardziej bólem głowy niż, powiedzmy, każda z bibliotek wydała. Sklonujesz repo, zbudujesz słoik i jesteś zdany na siebie. Szukasz poprawki błędów? / Align = "left" / Możesz dostać też inne rzeczy, które nie zostaną udokumentowane. Moim zdaniem oznacza to, że Volley jest nieobsługiwaną biblioteką stron trzecich, mimo że baza kodu jest w miarę aktywna. Caveat emptor.

  3. Jako nit, mający typ zawartości powiązany z typem klasy/żądania (JsonObjectRequest, ImageRequest, itp.) jest trochę niewygodne i zmniejsza elastyczność kodu wywołującego, ponieważ jesteś przywiązany do istniejącej hierarchii typów żądań. Lubię prostotę ustawiania Content-Type jako nagłówka, jak każdy inny (nie rób tego z Volley, przy okazji; skończysz z dwoma nagłówkami Content-Type!). To tylko moja osobista opinia i można to obejść.

To nie znaczy, że Volley nie ma jakiegoś pożytecznego funkcje. Z pewnością. Łatwo konfigurowalne zasady ponownego próbowania, przejrzyste buforowanie, interfejs API anulowania oraz obsługa planowania żądań i jednoczesnych połączeń to świetne funkcje. Po prostu wiedz, że nie jest on przeznaczony do wszystkich przypadków użycia HTTP (patrz punkt 1 powyżej), i że są pewne bóle głowy związane z wprowadzaniem Volley do użytku produkcyjnego w Twojej aplikacji(punkt 2).

 10
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-28 19:10:32

Niedawno znalazłem lib o nazwie ion , który przynosi trochę więcej do stołu.

Ion ma wbudowaną obsługę pobierania obrazów zintegrowaną z ImageView, JSON( z pomocą GSON), pliki i bardzo poręczną obsługę wątków UI.

Używam go w nowym projekcie i jak na razie wyniki były dobre. Jego zastosowanie jest znacznie prostsze niż w przypadku salwy czy doposażenia.

 7
Author: Tiago Gaspar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:56:25

Dodanie do zaakceptowanej odpowiedzi i co powiedział LOG_TAG....aby parsować dane w wątku tła, musisz podklasować Request<YourClassName>, ponieważ metoda onResponse jest wywoływana w głównym wątku i parsowanie w głównym wątku może spowodować opóźnienie interfejsu użytkownika, jeśli odpowiedź jest duża. Przeczytaj TUTAJ Jak to zrobić.

 3
Author: upenpat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 07:33:02

Retrofit 1.9.0 vs. RoboSpice

Używam obu w mojej aplikacji.

Robospice działa szybciej niż Retrofit, gdy analizuję zagnieżdżoną klasę JSON. Bo Spice Manger zrobi wszystko za Ciebie. W Retrofit musisz utworzyć GsonConverter i deserializować go.

Stworzyłem dwa fragmenty w tej samej aktywności i wywołałem w tym samym czasie z dwoma tego samego rodzaju adresami URL.

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
Author: Asthme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:55:29

I jeszcze jedna opcja: https://github.com/apptik/jus

  • jest modułowy jak Volley, ale jest bardziej rozbudowany i ulepsza dokumentację, obsługując różne stosy HTTP i konwertery po wyjęciu z pudełka
  • posiada moduł do generowania mapowań interfejsu API serwera, takich jak Retrofit
  • posiada również obsługę JavaRx

I wiele innych przydatnych funkcji jak markery, transformatory itp.

 1
Author: djodjo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:54:19