Dwuczęściowe pytanie od programisty iOS uczącego się Androida, pracującego nad projektem Android, który będzie składał różne żądania od JSON do obrazu do strumieniowego pobierania audio i wideo:
Na iOS intensywnie korzystałem z projektu AFNetworking . Czy istnieje odpowiednik biblioteki dla systemu Android?
Przeczytałem o OkHTTP i Retrofit by Square, a także Volley, ale nie mam jeszcze doświadczenia w rozwijaniu z nimi. Mam nadzieję, że ktoś może podać konkretne przykłady najlepszych przypadków użycia dla każdego z nich. Z tego, co przeczytałem, wydaje się, że OkHTTP jest najsolidniejszym z trzech i może sprostać wymaganiom tego projektu (wspomnianym powyżej).
android
networking
retrofit
android-networking
Alfie Hanssen
źródło
źródło
Odpowiedzi:
Użyj opcji Modernizuj, jeśli komunikujesz się z usługą internetową. Jeśli pobierasz obrazy, użyj biblioteki Picasso. Użyj OkHTTP, jeśli chcesz wykonywać operacje HTTP, które leżą poza Retrofit / Picasso.
Volley z grubsza konkuruje z Retrofit + Picasso. Na plus to jedna biblioteka. Z drugiej strony jest to
jedna nieudokumentowana,nieobsługiwana biblioteka „rzuć kod na ścianę i zrób na nim prezentację I | O”.EDYCJA - Volley jest teraz oficjalnie obsługiwany przez Google. Prosimy zapoznać się z Przewodnikiem dla programistów Google
Modernizacja używa OkHTTP automatycznie, jeśli jest dostępna. Istnieje Jist Wharton, który łączy Volleya z OkHTTP.
Prawdopodobnie nie użyjesz żadnego z nich do „strumieniowego pobierania plików audio i wideo”, zgodnie z konwencjonalną definicją „strumieniowania”. Zamiast tego platforma multimediów systemu Android obsłuży te żądania HTTP.
Biorąc to pod uwagę, jeśli zamierzasz wykonać własne strumieniowanie oparte na HTTP, OkHTTP powinien obsłużyć ten scenariusz; Nie pamiętam, jak dobrze Volley poradziłaby sobie z tym scenariuszem. Ani Modernizacja, ani Picasso nie są do tego przeznaczone.
źródło
Patrząc na perspektywę siatkówki, oto kilka zalet twojego wymagania:
Z jednej strony Volley jest całkowicie skoncentrowany na obsłudze indywidualnych, małych żądań HTTP. Jeśli więc obsługa żądań HTTP ma pewne dziwactwa, Volley prawdopodobnie ma dla ciebie haczyk. Z drugiej strony, jeśli masz dziwne podejście do przetwarzania obrazu, jedynym prawdziwym haczykiem jest ImageCache . „To nie jest nic, ale też nie jest wiele !,” ale ma więcej innych zalet, takich jak zdefiniowanie żądań, użycie ich z fragmentu lub działania jest bezbolesne, w przeciwieństwie do równoległych zadań AsyncTasks
Plusy i minusy Volley:
Co jest miłego w Volley?
Część sieci to nie tylko obrazy. Siatkówka ma być integralną częścią zaplecza. Dla świeżego projektu opartego na prostej usłudze REST może to być duża wygrana.
NetworkImageView jest bardziej agresywny w kwestii czyszczenia żądań niż Picasso i bardziej konserwatywny w zakresie wzorców użycia GC. NetworkImageView opiera się wyłącznie na silnych odwołaniach do pamięci i czyści wszystkie dane żądań, gdy tylko nowe żądanie zostanie utworzone dla ImageView lub gdy tylko ImageView zniknie z ekranu.
Wydajność. Ten post nie oceni tego roszczenia, ale najwyraźniej dołożyli starań, aby zachować rozsądek w zakresie wzorców wykorzystania pamięci. Volley stara się również grupować wywołania zwrotne do głównego wątku, aby zmniejszyć przełączanie kontekstu.
Najwyraźniej Volley też ma przyszłość. Sprawdź RequestFuture, jeśli jesteś zainteresowany.
Jeśli masz do czynienia ze skompresowanymi obrazami w wysokiej rozdzielczości, Volley jest jedynym rozwiązaniem, które działa dobrze.
Siatkówki można używać z Okhttp (nowa wersja Okhttp obsługuje NIO dla lepszej wydajności)
Volley gra dobrze z cyklem życia Activity.
Problemy z Volley:
Ponieważ Volley jest nowy, niewiele rzeczy nie jest jeszcze obsługiwanych, ale zostało naprawione.
Wnioski wieloczęściowe (rozwiązanie: https://github.com/vinaysshenoy/enhanced-volley )
kod stanu 201 jest traktowany jako błąd, kod statusu od 200 do 207 jest teraz udaną odpowiedzią. (Naprawiono: https://github.com/Vinayrraj/CustomVolley )
Aktualizacja: w najnowszej wersji Google volley błąd kodów statusu 2XX został naprawiony ! Dzięki Ficus Kirkpatrick!
jest mniej udokumentowany, ale wiele osób wspiera siatkówkę w github, dokumentację podobną do java można znaleźć tutaj . W witrynie dla programistów Androida możesz znaleźć przewodnik dotyczący przesyłania danych sieciowych za pomocą Volley . Kod źródłowy siatkówki można znaleźć w Google Git
Aby rozwiązać / zmienić Politykę przekierowań Volley Framework, użyj Volley z OkHTTP (CommonsWare wspomniane powyżej)
Możesz także przeczytać ładowanie tego obrazu Porównywanie salwy za pomocą Picassa
Modernizacja:
Jest wydany przez Square , oferuje bardzo łatwy w użyciu interfejs API REST (aktualizacja: Voila! Z obsługą NIO)
Zalety modernizacji:
W porównaniu do Volley, kod REST API Retrofit jest krótki i zapewnia doskonałą dokumentację API i ma dobre wsparcie w społecznościach! Bardzo łatwo jest dodać do projektów.
Możemy go używać z dowolną biblioteką serializacji, z obsługą błędów.
Aktualizacja: - Istnieje wiele bardzo dobrych zmian w Retrofit 2.0.0-beta2
Minusy modernizacji dla wersji 1.6:
Obsługa błędów związanych z pamięcią nie jest dobra (w starszych wersjach Retrofit / OkHttp) nie jestem pewien, czy została poprawiona dzięki Okio z obsługą Java NIO.
Minimalna pomoc w wątkach może spowodować oddzwonienie, jeśli użyjemy tego w niewłaściwy sposób.
(Wszystkie powyższe minusy zostały rozwiązane w nowej wersji Retrofit 2.0 beta)
================================================== ======================
Aktualizacja:
Android Async vs Volley vs. Retrofit wydajności (milisekundy, im niższa wartość, tym lepiej):
(FYI powyżej informacji o testach modernizacyjnych poprawi się dzięki obsłudze JIO NIO, ponieważ nowa wersja OKhttp jest zależna od biblioteki NIO Okio)
Kiedy stosować Volley ?!
Możemy użyć Volley, gdy musimy załadować obrazy, a także zużywać interfejsy API REST !, system kolejkowania połączeń sieciowych jest potrzebny dla wielu żądań n / w jednocześnie! również Volley ma lepszą obsługę błędów związanych z pamięcią niż Retrofit!
OkHttp może być używany z Volley, Retrofit domyślnie używa OkHttp ! Obsługuje SPDY , pule połączeń, buforowanie dysku, przezroczysta kompresja! Ostatnio ma pewne wsparcie dla java NIO z Okio biblioteką .
Źródło, źródło: volley-vs-retrofit autorstwa pana Josha Ruescha
Uwaga: w przypadku przesyłania strumieniowego zależy to od rodzaju przesyłania strumieniowego, takiego jak RTSP / RTCP.
źródło
MultipartEntityBuilder
whttpmime
bibliotece.RoboSpice vs. Salwa
Od https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
źródło
compile 'com.mcxiaoke.volley:library:1.0.+'
AFNetworking dla Androida:
Szybka sieć Android jest tutaj
Szybka biblioteka sieciowa Android obsługuje wszystkie typy żądań HTTP / HTTPS, takie jak GET, POST, DELETE, HEAD, PUT, PATCH
Szybka biblioteka sieciowa Android obsługuje pobieranie dowolnego rodzaju plików
Szybka biblioteka sieciowa Android obsługuje przesyłanie dowolnego rodzaju plików (obsługuje przesyłanie wieloczęściowe)
Szybka biblioteka sieciowa Android obsługuje anulowanie żądania
Szybka biblioteka sieciowa Android obsługuje ustawianie priorytetu dla każdego żądania (NISKI, ŚREDNI, WYSOKI, NATYCHMIAST)
Szybka biblioteka sieciowa Android obsługuje RxJava
Ponieważ wykorzystuje OkHttp jako warstwę sieciową, obsługuje:
Szybka biblioteka sieciowa Android obsługuje obsługę HTTP / 2, dzięki czemu wszystkie żądania do tego samego hosta współużytkują gniazdo
Szybka biblioteka sieciowa Androida korzysta z puli połączeń, co zmniejsza opóźnienie żądań (jeśli HTTP / 2 nie jest dostępne)
Przezroczysty GZIP zmniejsza rozmiary pobierania
Szybka biblioteka sieciowa Android obsługuje buforowanie odpowiedzi, co całkowicie eliminuje sieć przy powtarzaniu żądań
Dzięki: Biblioteka jest tworzona przeze mnie
źródło
Asynchroniczny klient HTTP loopj vs. Volley
Specyfiką mojego projektu są małe żądania HTTP REST, co 1-5 minut.
Używam asynchronicznego klienta HTTP (1.4.1) przez długi czas. Wydajność jest lepsza niż użycie waniliowego serwera Apache httpClient lub połączenia HTTP URL. W każdym razie nowa wersja biblioteki nie działa dla mnie: wyjątek między bibliotekami przeciął łańcuch wywołań zwrotnych.
Przeczytanie wszystkich odpowiedzi zmotywowało mnie do spróbowania czegoś nowego. Wybrałem bibliotekę Volley HTTP.
Po pewnym okresie użytkowania, nawet bez testów, widzę wyraźnie, że czas reakcji spadł do 1,5x, 2x Volley.
Może Retrofit jest lepszy niż asynchroniczny klient HTTP? Muszę tego spróbować. Ale jestem pewien, że Volley nie jest dla mnie.
źródło
Aby dodać trochę do dyskusji z mojego doświadczenia w pracy z Volley:
Volley nie obsługuje przesyłania strumieniowego ani pobierania w żadnym sensie. Oznacza to, że całe ciało żądania musi znajdować się w pamięci i nie można użyć polecenia an
OutputStream
do zapisania treści żądania do gniazda, ani też nie można użyć poleceniaInputStream
do odczytu treści odpowiedzi, tak jakHttpURLConnection
robi to podstawowo . Tak więc Volley jest kiepskim wyborem do przesyłania lub pobierania dużych plików. Twoje prośby i odpowiedzi powinny być małe. To jedno z największych ograniczeń Volleya, jakie osobiście spotkałem. Za to, co jest warte, OkHttp ma interfejsy do pracy ze strumieniami.Brak oficjalnej dokumentacji jest denerwujący, chociaż udało mi się to obejść, czytając kod źródłowy, co jest dość łatwe do naśladowania. Bardziej kłopotliwe jest to, że o ile mogę stwierdzić, Volley nie ma oficjalnych wersji i nie ma artefaktu Maven ani Gradle, a zatem zarządzanie tym uzależnieniem staje się bardziej bolesne niż, powiedzmy, żadna z bibliotek Square . Po prostu klonujesz repozytorium, budujesz słoik i jesteś sam. Szukasz poprawki błędu? Pobierz i miej nadzieję, że tam jest. Możesz też dostać inne rzeczy; nie będzie to udokumentowane. Moim zdaniem oznacza to, że Volley jest nieobsługiwaną biblioteką strony trzeciej, mimo że baza kodu jest dość aktywna. Zastrzegający emptor.
Jako nit, powiązanie Content-Type z typem klasy / żądania (JsonObjectRequest, ImageRequest itp.) Jest dość niewygodne i nieco zmniejsza elastyczność kodu wywołującego, ponieważ jesteś przywiązany do istniejącej hierarchii typów żądań Volley. Podoba mi się prostota ustawiania Content-Type jako nagłówka, jak każdy inny (tak na marginesie, nie rób tego z Volley; skończysz z dwoma nagłówkami Content-Type!). To tylko moja osobista opinia i można to obejść.
Nie oznacza to, że Volley nie ma żadnych przydatnych funkcji. Z pewnością tak. Łatwo konfigurowalne zasady ponawiania, przejrzyste buforowanie, interfejs API anulowania oraz obsługa planowania żądań i równoczesnych 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 istnieją pewne problemy związane z uruchomieniem Volley w produkcji w Twojej aplikacji (punkt 2).
źródło
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 (przy pomocy GSON), pliki i bardzo przydatną obsługę wątków interfejsu użytkownika.
Używam go w nowym projekcie i jak dotąd wyniki były dobre. Jego użycie jest znacznie prostsze niż Volley lub Retrofit.
źródło
Dodając do zaakceptowanej odpowiedzi i tego, co powiedział LOG_TAG .... aby Volley parsował twoje dane w wątku w tle, musisz podklasę,
Request<YourClassName>
ponieważonResponse
metoda jest wywoływana w głównym wątku, a parsowanie w głównym wątku może spowodować opóźnienie interfejsu użytkownika, jeśli twoja odpowiedź jest duży. Przeczytaj tutaj, jak to zrobić.źródło
Modernizacja 1.9.0 vs. RoboSpice
Używam obu w mojej aplikacji.
Robospice działa szybciej niż Retrofit za każdym razem, gdy analizuję zagnieżdżoną klasę JSON. Ponieważ Spice Manger zrobi wszystko za Ciebie. W ramach modernizacji musisz utworzyć GsonConverter i dokonać deserializacji.
Utworzyłem dwa fragmenty w tej samej aktywności i zadzwoniłem w tym samym czasie z dwoma rodzajami adresów URL.
źródło
I jeszcze jedna opcja: https://github.com/apptik/jus
I wiele innych przydatnych funkcji, takich jak markery, transformatory itp.
źródło