Comparaison des bibliothèques de 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 de téléchargement en streaming audio et vidéo:

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

  2. j'ai lu sur OkHTTP et Retrofit by Square, ainsi que Volley mais n'ont pas encore l'expérience de développement avec eux. J'espère que quelqu'un pourra fournir des exemples concrets de cas de meilleure utilisation pour chacun. D'après ce que j'ai lu, il semble Qu'OkHTTP est le plus robuste des trois, et pourrait répondre aux exigences de ce projet (mentionné ci-dessus).

505
demandé sur Peter Mortensen 2013-06-03 21:47:04

10 réponses

j'espère que quelqu'un peut fournir des exemples concrets de cas de meilleure utilisation pour chacun.

utilisez Retrofit si vous communiquez avec un service Web. Utilisez la bibliothèque de pair Picasso si vous téléchargez des images. Utilisez OkHTTP si vous avez besoin de faire des opérations HTTP qui se trouvent à l'extérieur de Retrofit/Picasso.

Volley rivalise grossièrement avec Retrofit + Picasso. Sur le côté positif, c'est une bibliothèque. Sur le côté négatif, c'est un sans-papiers, non pris en charge, "jeter le code sur le mur et faire un I|O présentation," de la bibliothèque.

EDIT-Volley est maintenant officiellement supporté par Google. Veuillez vous référer à Google Developer Guide

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

Retrofit utilise OkHTTP automatiquement si disponible. Il y a un l'Essentiel de Jake Wharton qui se connecte Volley à OkHTTP.

et pourrait répondre aux exigences de ce projet (mentionné ci-dessus).

Probablement vous utilisez aucun d'entre eux pour "téléchargement de fichiers audio et vidéo", par la définition traditionnelle de "streaming". Au lieu de cela, le Media framework D'Android traitera ces requêtes HTTP pour vous.

cela dit, si vous allez pour essayer de faire votre propre streaming basé sur HTTP, OkHTTP devrait gérer ce scénario; Je ne me souviens pas comment Volley gérerait ce scénario. Ni la rénovation ni Picasso ne sont conçus pour cela.

611
répondu CommonsWare 2016-12-06 09:00:27

en regardant la perspective de Volley voici quelques avantages pour votre exigence:

Volley, d'une part, est totalement focalisé sur le traitement des petites requêtes HTTP individuelles. Donc si votre gestion de requête HTTP a quelques bizarreries, Volley a probablement un crochet pour vous. Si, d'un autre côté, vous avez une bizarrerie dans votre gestion d'image, le seul vrai crochet que vous avez est ImageCache . "Ce n'est pas rien, mais ce n'est pas beaucoup!, soit." mais il a plus d'autres avantages comme une fois que vous définissez vos requêtes, leur utilisation à partir d'un fragment ou d'une activité est indolore contrairement aux AsyncTasks parallèles

pour et contre de Volley:

alors Qu'est-ce qu'il y a de bien à propos de Volley?

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

  • NetworkImageView est plus agressif sur demande de nettoyage de Picasso, et plus conservateur dans ses modèles D'utilisation de GC. NetworkImageView s'appuie exclusivement sur de solides références de mémoire, et nettoie toutes les données de la demande dès qu'une nouvelle demande est faite pour un ImageView, ou dès que ImageView sort de l'écran.

  • Performance. Ce post ne sera pas évaluer cette revendication, mais ils ont clairement j'ai pris soin d'être judicieux dans leurs habitudes d'utilisation de la mémoire. Volley fait également un effort pour batch callbacks au fil principal à réduire la commutation de contexte.

  • Volley a apparemment aussi des contrats à terme. Vérifier la demande à l'avenir si vous êtes intéresser.

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

  • Volley peut être utilisé avec Okhttp (nouvelle version D'Okhttp prend en charge NIO pour une meilleure performance )

  • Volley-ball joue de nice avec l'Activité du cycle de vie.

Problèmes De Volley:

Comme Volley est nouveau, peu de choses ne sont pas encore supportées, mais c'est fixe.

  1. Multipart Requests (Solution: https://github.com/vinaysshenoy/enhanced-volley )

  2. le code de statut 201 est considéré comme une erreur, le code de statut 200 à 207 sont des réponses réussies maintenant.(Fixe: https://github.com/Vinayrraj/CustomVolley )

    mise à jour: dans la dernière version de Google volley, le bogue des codes de statut 2XX est corrigé maintenant!Merci à Ficus Kirkpatrick!

  3. c'est moins documenté mais beaucoup de gens soutiennent volley en GitHub, java comme la documentation peut être trouvé ici . Sur le site android developer, vous pouvez trouver le guide pour transmission de données réseau en utilisant Volley . Et volley code source peut être trouvé à la Google Git

  4. Pour résoudre/modifier Réorienter la Politique de Volley-ball Cadre d'usage Volley-ball avec OkHTTP (CommonsWare mentionné ci-dessus)

vous pouvez aussi lire ce comparant le chargement D'image de Volley avec Picasso

"Retrofit:

il est publié par Square , il offre très facile à utiliser REST API (mise à jour: Voila! avec NIO de soutien)

Pros de la Rénovation:

  • comparé à Volley, le code de L'API REST de Retrofit est bref et fournit excellente documentation API et a 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 le traitement des erreurs.

Maj: - Il ya beaucoup de très bons changements dans la modernisation 2.0.0-beta2

  • la version 1.6 de Retrofit avec OkHttp 2.0 dépend désormais de Okio pour supporter java.io et java.nio ce qui rend beaucoup plus facile l'accès, le stockage et le traitement de vos données en utilisant ByteString et Buffer pour faites des choses intelligentes pour sauver le CPU et la mémoire. (POUR INFORMATION: cela me rappelle la bibliothèque Koush's OIN avec le soutien de NIO!) Nous pouvons utiliser Retrofit avec RxJava pour combiner et enchaîner les appels de repos en utilisant rxobservables pour éviter les chaînes de rappel laides (pour éviter l'enfer du rappel!!) .

Cons d'adaptation pour la version 1.6:

  • la fonctionnalité de gestion des erreurs liées à la mémoire N'est pas bonne (dans les anciennes versions de Retrofit/OkHttp) pas sûr si elle est améliorée avec L'Okio avec le soutien de Java NIO.

  • l'assistance de filetage Minimum peut entraîner le rappel de l'enfer si nous utilisons ce de façon incorrecte.

(tous les inconvénients ci-dessus ont été résolus dans le nouveau version de Retrofit 2.0 beta)

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

mise à jour:

Android Async vs Volley vs Retrofit performance benchmarks (millisecondes, plus faible valeur est mieux):

Android Async vs Volley vs Retrofit performance benchmarks

(FYI au-dessus de Rénovation Benchmarks info s'améliorera avec le support NIO java parce que la nouvelle version D'OKhttp dépend de la bibliothèque NIO Okio)

dans les trois essais avec répétitions variables( 1-25 fois), Volley a été n'importe où à partir de 50% à 75% plus rapide. Rénovation cadencé à une impressionnante 50% à 90% plus rapide que les AsyncTasks, même nombre de fois. Sur la suite de test Dashboard, cette traduction dans le chargement / analyse des données plusieurs secondes plus vite. C'est un massive dans le monde réel différence. Afin de rendre les tests équitables, le les temps pour AsyncTasks / Volley incluaient le JSON parsing comme pour vous automatiquement.

la modernisation gagne au test de référence!

en fin de compte, nous avons décidé D'opter pour la modernisation pour notre application. Pas seulement, c'est ridiculement rapide, mais il se mêle très bien avec notre architecture existante. Nous avons été en mesure pour 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 APIs. En vue de la fusion en Nous avons dû changer le nom de nos variables pour rendre nos modèles GSON conforme, écrire quelques interfaces simples, supprimer des fonctions de la ancienne API, et modifier nos fragments pour ne pas utiliser AsyncTasks. Maintenant que nous avoir quelques fragments complètement convertis, c'est assez indolore. Y étaient quelques douleurs de croissance et des problèmes que nous avions à surmonter, mais globalement ça s'est bien passé. Au début, nous avons rencontré quelques problèmes techniques/ bugs, mais Square a une communauté Google+ fantastique qui a été en mesure de nous aider à travers elle.

quand utiliser Volley?!

nous pouvons utiliser de la Volley quand nous avons besoin de charger des images ainsi que la consommation D'APIs de repos!, le système de mise en file d'attente d'appel réseau est nécessaire pour de nombreuses demandes n / w en même temps! aussi Volley a une meilleure mémoire gestion des erreurs liées à la mise à niveau!

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

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

Note: à propos de la diffusion en continu, cela dépend du type de diffusion que vous voulez comme RTSP/RTCP.

335
répondu LOG_TAG 2017-12-14 08:05:15

RoboSpice Vs. Volley

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 fil et ce n'est pas la façon dont le traitement d'arrière-plan devrait avoir lieu sur Android. En fin de compte, vous pouvez creuser deux libs et de trouver qu'ils sont assez similaires, mais notre façon de faire le traitement d'arrière-plan est plus orienté vers Android, il nous permet, par exemple, de dire aux utilisateurs que RS fait réellement quelque chose en arrière-plan, ce qui serait difficile pour volley (en fait, ce n'est pas du tout le cas).
  • RoboSpice et volley offrent toutes deux de belles fonctionnalités comme la priorisation, les politiques de Ré-essai, l'annulation de la demande. Mais RS offre plus : un cache plus avancé et c'est un gros cache, avec la gestion du cache, l'agrégation des requêtes, plus de fonctionnalités comme le re-téléchargement vers une requête en attente, gérer l'expiration du cache sans se fier aux en-têtes du serveur, etc.
  • RoboSpice fait plus en dehors du fil UI : volley désérialisera vos POJOs sur le fil principal, ce qui est horrible à mon esprit. Avec RS votre application sera plus réactif.
  • en termes de vitesse, nous avons vraiment besoin de mesures. RS est devenu super rapide maintenant, mais nous n'avons toujours 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 les extensions. Vous pouvez l'utiliser avec okhttp, rénovation, ormlite (bêta), jackson, jackson2, gson, sérialiseur xml, google client http, printemps android... Beaucoup. Volley peut être utilisé avec OK http et utilise gson. c'est tout.
  • Volley propose en plus de l'INTERFACE utilisateur de sucre que RS. Volley fournit NetworkImageView, RS fournit un adaptateur spicelist. En ce qui concerne la 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 publication initiale. C'est assez robuste et utilisé dans la production. Volley est moins mature, mais sa base d'utilisateurs devrait croître rapidement (Google effect).
  • RoboSpice est disponible sur maven central. Volley est difficile à trouver;)
42
répondu Snicolas 2015-02-18 22:14:03

async HTTP client loopj vs. Volley

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

j'utilise depuis longtemps un client HTTP async (1.4.1). La performance est meilleure que L'utilisation de la connection d'URL http ou de la connection HttpClient. Quoi qu'il en soit, la nouvelle version de la bibliothèque ne fonctionne pas pour moi: library inter exception réduit la chaîne de callbacks.

Reading 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 essais, je vois clairement que le temps de réponse est de 1.5 x, 2x Volley.

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

17
répondu Sergey Vakulenko 2017-01-21 10:52:44

AFNetworking for Android:

Fast Android de Réseau 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 multipart télécharger)

Fast Android de Réseau de la Bibliothèque prend en charge l'annulation d'une demande

Fast Android Networking Library supports setting priority to any request (LOW, MEDIUM, HIGH, IMMEDIATE)

Fast Android de Réseau de la Bibliothèque prend en charge RxJava

comme il utilise OkHttp comme couche réseau, il supporte:

Fast Android Networking Library prend en charge le support HTTP / 2 permet toutes les requêtes pour le même hôte de partager une socket

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

Transparent GZIP shrinks download sizes""

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

Merci: la Bibliothèque est créée par moi

17
répondu Amit Shekhar 2017-01-21 10:53:32

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 en continu. C'est-à-dire que tout le corps de la requête doit être en mémoire et vous ne pouvez pas utiliser un OutputStream pour écrire le corps de la requête sur la socket sous-jacente, ni utiliser un InputStream pour lire le corps de la réponse, comme le fait un HttpURLConnection de base. Donc, Volley est un mauvais choix pour télécharger ou télécharger de gros fichiers. Vos demandes et réponses doivent être limitées. C'est l'une des plus grandes limites de Volley que j'ai personnellement rencontré. Pour ce que ça vaut, OkHttp a des interfaces pour travailler avec les flux.

  2. le manque de documentation officielle est gênant, bien que j'ai pu contourner cela en lisant le code source, qui est assez facile à suivre. Ce qui est plus gênant, c'est que, pour autant que je sache, Volley n'a pas les versions officielles de publication et aucun artéfact Maven ou Grad, et donc le gérer comme une dépendance devient plus un casse-tête que, disons, n'importe quel de la place des bibliothèques a publié. Tu clones une banque, tu construis un bocal, et tu es tout seul. La recherche d'une correction de bug? Chercher et j'espère qu'il est là. Vous pourriez obtenir d'autres choses, aussi; il ne sera pas documenté. À mon avis, cela signifie effectivement que Volley est une bibliothèque de tiers non supportée, même si la base de code est raisonnablement active. Mise en garde emptor.

  3. comme nit, ayant le type de contenu lié au type de classe/requête (JsonObjectRequest, ImageRequest, etc.) est un peu embarrassant et réduit un peu la flexibilité du code appelant, car vous êtes lié à la hiérarchie de type de requête existante de Volley. J'aime la simplicité de définir Content-Type comme un en-tête comme les autres (ne faites pas cela avec Volley, soit dit en passant; vous finirez avec deux en-têtes Content-Type!). C'est juste mon personnel avis, cependant, et il peut être contourné.

cela ne veut pas dire que Volley n'a pas quelques caractéristiques utiles. Il n'est certainement. Les politiques de rejugement facilement personnalisables, la mise en cache transparente, une API d'Annulation, et la prise en charge de l'ordonnancement des requêtes et des connexions simultanées sont de grandes fonctionnalités. Sachez juste qu'il N'est pas destiné à tous les cas D'utilisation HTTP (voir point 1 ci-dessus), et qu'il y a quelques maux de tête en mettant Volley dans la production utiliser dans votre application (article 2).

10
répondu Jeff 2014-08-28 19:10:32

j'ai récemment trouvé un lib appelé ion qui apporte un petit extra à la table.

ion a pris en charge le téléchargement d'image intégré à ImageView, JSON (avec L'aide de GSON), les fichiers et un support de threading D'interface 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 le Volley ou le Retrofit.

7
répondu Tiago Gaspar 2017-01-21 10:56:25

ajoute à la réponse acceptée et à ce que LOG_TAG a dit....pour que Volley analyse vos données dans un thread de fond, vous devez utiliser la sous-classe Request<YourClassName> car la méthode onResponse est appelée Sur le thread principal et l'analyse sur le thread principal peut causer un décalage de L'interface utilisateur si votre réponse est importante. Lire ici sur la façon de faire cela.

3
répondu upenpat 2015-03-16 07:33:02

Retrofit 1.9.0 vs. RoboSpice

j'utilise les deux dans mon application.

Robospice fonctionne plus vite que Retrofit chaque fois que je parle la classe imbriquée JSON. Parce que Spice Manger fera tout pour toi. En Retrofit, vous devez créer GsonConverter et le deserialiser.

j'ai créé deux fragments dans la même activité et appelé le même temps avec deux types D'URLs.

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
répondu Asthme 2017-01-21 10:55:29

et encore une autre option: https://github.com/apptik/jus

  • il est modulaire comme Volley, mais plus étendu et la documentation s'améliore, en supportant différentes piles HTTP et Convertisseurs hors de la boîte
  • il a un module pour générer des mappages D'interface API de serveur comme Retrofit
  • il a aussi JavaRx soutien

et beaucoup d'autres caractéristiques pratiques comme les marqueurs, les transformateurs, etc.

1
répondu djodjo 2017-01-21 10:54:19