Question Comparaison des bibliothèques réseau Android: OkHTTP, Retrofit et Volley [fermé]


Question en deux parties d'un développeur iOS apprenant Android, travaillant sur un projet Android qui fera une variété de demandes de JSON à l'image au téléchargement en streaming de l'audio et de la vidéo:

  1. Sur iOS, j'ai utilisé le AFNetworking projet intensif. Y a-t-il une bibliothèque équivalente pour Android?

  2. J'ai lu sur OkHTTP et Rénovation par Square, ainsi que Volée mais n'ont pas encore d'expérience de développement avec eux. J'espère que quelqu'un peut fournir des exemples concrets des meilleurs cas d'utilisation pour chacun. D'après ce que j'ai lu, OkHTTP semble être le plus robuste des trois et pourrait répondre aux exigences de ce projet (mentionné ci-dessus).


502
2018-06-03 17:47


origine


Réponses:


J'espère que quelqu'un peut fournir des exemples concrets des meilleurs cas d'utilisation pour chacun.

Utilisez Retrofit si vous communiquez avec un service Web. Utilisez la bibliothèque homologue Picasso si vous téléchargez des images. Utilisez OkHTTP si vous devez effectuer des opérations HTTP en dehors de Retrofit / Picasso.

Volley rivalise grosso modo avec Retrofit + Picasso. Du côté positif, c'est une bibliothèque. Du côté négatif, c'est un sans-papiers, "Non supporté", lancez le code sur le mur et faites-y une bibliothèque I | O.

EDIT - Volley est maintenant officiellement pris en charge par Google. Veuillez vous référer Guide du développeur Google

D'après ce que j'ai lu, OkHTTP est le plus robuste des 3

Retrofit utilise automatiquement OkHTTP si disponible. Il y a un Gist de Jake Wharton qui relie Volley à OkHTTP.

et pourrait gérer les exigences de ce projet (mentionné ci-dessus).

Vous n'en utiliserez probablement aucun pour le "téléchargement en continu de l'audio et de la vidéo", selon la définition conventionnelle du "streaming". Au lieu de cela, la structure multimédia d'Android traitera ces requêtes HTTP pour vous.

Cela étant dit, si vous essayez de faire votre propre streaming basé sur HTTP, OkHTTP devrait gérer ce scénario; Je ne me souviens pas à quel point Volley gérerait ce scénario. Ni Retrofit ni Picasso ne sont conçus pour cela.


606
2018-06-03 18:18



En regardant la perspective Volley, voici quelques avantages pour votre exigence:

Volley, d'une part, est totalement concentré sur la gestion de petites requêtes HTTP individuelles. Donc, si la gestion de vos requêtes HTTP comporte des bizarreries, Volley a probablement un hook pour vous. Si, d'un autre côté, vous avez une bizarrerie dans le traitement de votre image, le seul vrai crochet que vous avez est ImageCache. "Ce n’est pas rien, mais ce n’est pas beaucoup!". mais il a d'autres avantages comme une fois que vous définissez vos demandes, les utiliser à partir d'un fragment ou d'une activité est indolore à la différence des AsyncTasks parallèles

Avantages et inconvénients de Volley:

Alors qu'est-ce qui est bien avec Volley?

  • La partie réseau n'est pas seulement pour les images. Volley est destiné à être une partie intégrante de votre end back. Pour un nouveau projet basé sur un service REST simple, cela pourrait être une grande victoire.

  • NetworkImageView est plus agressif sur le nettoyage des requêtes que Picasso, et plus conservatrice dans ses habitudes d'utilisation du GC. NetworkImageView repose exclusivement sur des références de mémoire forte, et nettoie toutes les données de requête dès qu'une nouvelle demande est faite pour un ImageView, ou dès que ImageView se déplace hors de l'écran.

  • Performance. Ce post n'évaluera pas cette affirmation, mais ils ont clairement pris soin d'être judicieux dans leurs habitudes d'utilisation de la mémoire. Volley fait également un effort pour rappeler par lots le fil principal à réduire le changement de contexte.

  • Volley a apparemment aussi un avenir. Vérifiez RequestFuture si vous êtes intéressé.

  • Si vous avez affaire à des images compressées à haute résolution, Volley est la seule solution ici fonctionne bien.

  • Volley peut être utilisé avec Okhttp (La nouvelle version d'Okhttp supporte NIO pour de meilleures performances)

  • Volley joue bien avec le cycle de vie de l'activité.

Problèmes avec Volley:
Depuis que Volley est nouveau, peu de choses ne sont pas encore supportées, mais c'est corrigé.

  1. Demandes multipart (Solution: https://github.com/vinaysshenoy/enhanced-volley)

  2. le code d'état 201 est pris comme une erreur, le code d'état de 200 à 207 sont des réponses réussies maintenant. https://github.com/Vinayrraj/CustomVolley)

    Mettre à jour: dans la dernière version de Google volley, le bug des codes d'état 2XX est fixé maintenant, merci à Ficus Kirkpatrick!

  3. il est moins documenté mais beaucoup de personnes soutiennent la volée en github, la documentation java peut être trouvée ici. Sur le site Web du développeur Android, vous pouvez trouver un guide pour Transmission de données réseau à l'aide de Volley. Et le code source de volley peut être trouvé à Google Git

  4. Pour résoudre / changer Rediriger la politique de Volley Utilisation du cadre Volley avec OkHTTP (CommonsWare mentionné ci-dessus)

Aussi, vous pouvez lire ceci Comparer le chargement de l'image de Volley avec Picasso

Rénovation:

Il est sorti par Carré, Ceci offre une API REST très facile à utiliser (Mise à jour: Voila! Avec le support NIO)

Avantages de Retrofit:

  • Comparé à Volley, le code REST API de Retrofit est bref et fournit excellente documentation de l'API et un bon support dans les communautés! Il est très facile d'ajouter dans les projets.

  • Nous pouvons l'utiliser avec n'importe quelle bibliothèque de sérialisation, avec gestion des erreurs.

Mettre à jour:  - Il y a beaucoup de très bons changements dans Retrofit 2.0.0-beta2

  • La version 1.6 de Retrofit avec OkHttp 2.0 dépend maintenant de Okio soutenir java.io et java.nio ce qui facilite l'accès, le stockage et le traitement de vos données en utilisant ByteString et Tampon faire des choses intelligentes pour économiser le processeur et la mémoire. (FYI: Cela me rappelle le OIN de Koush bibliothèque avec support NIO!) On peut utiliser Retrofit avec RxJava combiner et enchaîner les appels REST en utilisant rxObservables pour éviter les chaînes de rappel laides (pour éviter l'appel de l'enfer !!).

Inconvénients de Retrofit pour la version 1.6:

  • Les fonctionnalités de gestion des erreurs liées à la mémoire ne sont pas bonnes (dans les anciennes versions de Retrofit / OkHttp).

  • L'assistance de filetage minimum peut entraîner un rappel de l'enfer si nous utilisons cette d'une manière incorrecte.

(Tous les inconvénients ci-dessus ont été résolus dans la nouvelle version de Retrofit 2.0 beta)

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

Mettre à jour:

Tests de performance Android Async vs Volley vs Retrofit (en millisecondes, la valeur inférieure est la meilleure):

Android Async vs Volley vs Retrofit performance benchmarks

(L'information ci-dessus au-dessus de l'amélioration de Benchmarks améliorera avec le soutien de Java NIO parce que la nouvelle version d'OKhttp dépend de la bibliothèque de NIO Okio) 

Dans les trois tests avec des répétitions variables (1 - 25 fois), Volley était   de 50% à 75% plus rapide. Retrofit a enregistré un impressionnant   50% à 90% plus rapide que les AsyncTasks, atteignant le même point de terminaison   même nombre de fois. Dans la suite de tests Dashboard, cette traduction   dans le chargement / l'analyse des données plusieurs secondes plus rapidement. C'est un   différence massive du monde réel. Afin de rendre les tests équitables, le   fois pour AsyncTasks / Volley inclus l'analyse JSON comme le fait Retrofit   pour vous automatiquement.

RetroFit gagne dans le test de référence!

En fin de compte, nous avons décidé d'aller avec Retrofit pour notre application. ne pas   seulement est-ce ridiculement rapide, mais il se marie assez bien avec notre   architecture existante. Nous avons été en mesure de faire un rappel parent   Interface qui effectue automatiquement la gestion des erreurs, la mise en cache et   pagination avec peu ou pas d'effort pour nos API. Pour fusionner   Retrofit, nous avons dû renommer nos variables pour rendre nos modèles GSON   conforme, écrire quelques interfaces simples, supprimer des fonctions de la   ancienne API et modifiez nos fragments pour ne pas utiliser AsyncTasks. Maintenant que nous   avoir quelques fragments complètement convertis, c'est assez indolore. Là   étaient quelques douleurs et problèmes de croissance que nous avons dû surmonter, mais   Globalement, tout s'est bien passé. Au début, nous avons rencontré quelques   problèmes techniques / bugs, mais Square a une fantastique communauté Google+   c'était capable de nous aider à traverser ça.

Quand utiliser Volley ?!

Nous pouvons utiliser Volley lorsque nous avons besoin de charger des images ainsi que de consommer des API REST !, le système de mise en file d'attente réseau est nécessaire pour beaucoup de demandes n / w en même temps! aussi Volley a une meilleure gestion des erreurs liées à la mémoire que Retrofit!

OkHttp peut être utilisé avec Volley, Retrofit utilise OkHttp par défaut! Il a SPDY support, mise en commun des connexions, mise en cache disque, compression transparente! Récemment, il a obtenu un certain soutien de Java NIO avec Okio bibliothèque.

Source, crédit: volley-vs-retrofit par M. Josh Ruesch

Remarque: A propos du streaming, cela dépend du type de streaming que vous voulez comme RTSP / RTCP. 


334
2017-09-18 03:33



Vs RoboSpice. Volée 

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

  • RoboSpice (RS) est basé sur le service et plus respectueux de la philosophie Android que Volley. Volley est basé sur le thread et ce n'est pas la façon dont le traitement en arrière-plan devrait avoir lieu sur Android. En fin de compte, vous pouvez décomposer les deux bibliothèques et trouver qu'elles sont assez similaires, mais notre façon de faire du traitement en arrière-plan est plus orientée Android, cela nous permet, par exemple, de dire aux utilisateurs que RS fait quelque chose en arrière-plan. difficile pour la volée (en fait ce n'est pas du tout).
  • RoboSpice et volley offrent toutes deux des fonctionnalités intéressantes comme la définition des priorités, la stratégie de réessai, la demande d'annulation. Mais RS offre plus: une mise en cache plus avancée, avec une gestion de cache, une agrégation de requêtes, plus de fonctionnalités telles que le rebranchement sur une requête en attente, l'expiration du cache sans dépendre d'en-têtes de serveur, etc.
  • RoboSpice fait plus en dehors de l'interface utilisateur Thread: volley va désérialiser vos POJO sur le fil principal, ce qui est horrible à mon avis. Avec RS votre application sera plus sensible.
  • En termes de rapidité, nous avons absolument besoin de métriques. RS est devenu super rapide maintenant, mais nous n'avons pas de chiffre à mettre ici. Volley devrait théoriquement être un peu plus rapide, mais RS est maintenant massivement parallèle ... qui sait?
  • RoboSpice offre une large gamme de compatibilité avec des extensions. Vous pouvez l'utiliser avec okhttp, retrofit, ormlite (bêta), jackson, jackson2, gson, sérialiseur xml, google client http, printemps android ... Beaucoup de choses. Volley peut être utilisé avec ok http et utilise gson. c'est tout.
  • Volley offre plus de sucre UI que RS. Volley fournit NetworkImageView, RS fournit un adaptateur de type spicelist. En termes de fonctionnalité ce n'est pas si loin, mais je crois que Volley est plus avancé sur ce sujet.
  • Plus de 200 bogues ont été résolus dans RoboSpice depuis sa sortie initiale. C'est assez robuste et très utilisé dans la production. Volley est moins mature mais sa base d'utilisateurs devrait être en croissance rapide (effet Google).
  • RoboSpice est disponible sur maven central. Volley est difficile à trouver;)

42
2018-01-10 18:16



Client HTTP async loopj vs. Volley

Les spécificités de mon projet sont de petites requêtes HTTP REST, toutes les 1-5 minutes.

J'utilise un client HTTP asynchrone (1.4.1) depuis longtemps. La performance est meilleure que l'utilisation de l'Apache httpClient vanille ou une connexion URL HTTP. Quoi qu'il en soit, la nouvelle version de la librairie ne fonctionne pas pour moi: la bibliothèque inter exception coupe la chaîne des callbacks.

Lire toutes les réponses m'a motivé à essayer quelque chose de nouveau. J'ai choisi la bibliothèque HTTP Volley.

Après l'avoir utilisé pendant un certain temps, même sans tests, je vois clairement que le temps de réponse est de 1.5x, 2x Volley.

Peut-être que Retrofit est meilleur qu'un client HTTP asynchrone? J'ai besoin de l'essayer. Mais je suis sûr que Volley n'est pas pour moi.


17
2018-06-06 08:07



AFNetworking pour Android:

Mise en réseau rapide d'Android est ici 

Fast Android Networking Library prend en charge tous les types de requêtes HTTP / HTTPS comme GET, POST, DELETE, HEAD, PUT, PATCH

Fast Android Networking Library prend en charge le téléchargement de tout type de fichier

Fast Android Networking Library prend en charge le téléchargement de tout type de fichier (prend en charge le téléchargement multipart)

Fast Android Networking Library prend en charge l'annulation d'une requête

Fast Android Networking Library prend en charge la définition de la priorité à toute demande (LOW, MEDIUM, HIGH, IMMEDIATE)

Fast Android Networking Library prend en charge RxJava

Comme il utilise OkHttp comme couche réseau, il prend en charge:

La prise en charge rapide de la prise en charge HTTP / 2 par la bibliothèque de réseaux Android rapide permet à toutes les demandes envoyées au même hôte de partager une socket

Fast Android Networking Library utilise le pool de connexions qui réduit la latence des requêtes (si HTTP / 2 n'est pas disponible)

GZIP transparent réduit les tailles de téléchargement

Fast Android Networking Library prend en charge la mise en cache des réponses qui évite complètement le réseau pour les demandes répétées

Merci: La bibliothèque est créée par moi


17
2017-07-16 15:39



Juste pour ajouter un peu à la discussion de mon expérience de travail avec Volley:

  1. Volley ne gère pas les téléchargements ou les téléchargements en continu. C’est-à-dire que l’ensemble du corps de la requête doit être en mémoire et que vous ne pouvez pas utiliser un OutputStream pour écrire le corps de la requête sur le socket sous-jacent, vous ne pouvez pas non plus utiliser un InputStream lire le corps de la réponse, comme base HttpURLConnection Est-ce que. Donc, Volley est un mauvais choix pour télécharger ou télécharger de gros fichiers. Vos demandes et réponses devraient être petites. C'est l'une des plus grandes limitations de Volley que j'ai personnellement rencontrées. Pour ce que ça vaut, OkHttp a des interfaces pour travailler avec les flux.

  2. Le manque de documentation officielle est agaçant, bien que j'ai pu contourner ce problème en lisant le code source, ce qui est assez facile à suivre. Ce qui est plus gênant, c'est que, pour autant que je sache, Volley n'a pas de version officielle ni d'artefact Maven ou Gradle, et donc la gérer comme une dépendance devient plus un mal de tête que, disons, l'une des librairies Square . Vous n'avez qu'à cloner un repo, construire un pot, et vous êtes seul. Vous cherchez une solution de bogue? Fetch et espère qu'il est là. Vous pourriez aussi avoir d'autres choses. il ne sera pas documenté. À mon avis, cela signifie effectivement que Volley est une bibliothèque tierce non supportée, même si la base de code est raisonnablement active. Caveat emptor.

  3. En tant que tel, avoir un Content-Type lié au type de classe / requête (JsonObjectRequest, ImageRequest, etc.) est plutôt gênant et réduit un peu la flexibilité du code appelant, car vous êtes lié à la hiérarchie de type Requête existante de Volley. J'aime la simplicité de simplement définir Content-Type comme un en-tête comme un autre (ne faites pas ceci avec Volley, à propos, vous vous retrouverez avec deux en-têtes Content-Type!). Ce n'est que mon opinion personnelle, et on peut y remédier.

Cela ne veut pas dire que Volley n'a pas de fonctionnalités utiles. C'est certainement le cas. Des stratégies de nouvelle tentative facilement personnalisables, une mise en cache transparente, une API d'annulation et la prise en charge de la planification des demandes et des connexions simultanées sont des fonctionnalités exceptionnelles. Sachez simplement que ce n'est pas prévu pour tous les cas d'utilisation HTTP (voir le point 1 ci-dessus), et qu'il y a quelques casse-tête impliqués dans la mise en production de Volley dans votre application (item 2).


10
2017-08-28 19:10



J'ai récemment trouvé une lib appelée ion cela apporte un peu plus à la table.

ion a un support intégré pour le téléchargement d'images intégré avec ImageView, JSON (avec l'aide de GSON), des fichiers et un support de threads UI très pratique.

Je l'utilise sur un nouveau projet et jusqu'à présent les résultats ont été bons. Son utilisation est beaucoup plus simple que Volley ou Retrofit.


7
2018-03-29 03:28