web-dev-qa-db-fra.com

Comparaison de Android bibliothèques de réseau: OkHTTP, Retrofit et Volley

Question en deux parties d'un développeur iOS apprenant Android, travaillant sur un projet Android, qui fera diverses requêtes, du JSON à l'image, en passant par le téléchargement en continu de l'audio et de la vidéo:

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

  2. J'ai lu sur OkHTTP et Retrofit par Square, ainsi que Volley mais je n'ai pas encore d'expérience dans le développement avec eux. J'espère que quelqu'un pourra 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).

556
Alfie Hanssen

J'espère que quelqu'un pourra 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 autres que Retrofit/Picasso.

Volley est en concurrence avec Retrofit + Picasso. Du côté positif, c'est une bibliothèque. Du côté des inconvénients, c’est un sans-papiers, non pris en charge, "jetez le code par-dessus le mur et effectuez une présentation I | O dessus".

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 semble être le plus robuste des 3

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

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

Vous n'utiliserez probablement aucun d'eux pour "télécharger en streaming des fichiers audio et vidéo", selon la définition classique du "streaming". Au lieu de cela, l'infrastructure multimédia d'Android gérera ces requêtes HTTP pour vous.

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

636
CommonsWare

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

Volley, d’une part, est totalement concentré sur le traitement des petites requêtes HTTP individuelles. Donc, si votre gestion de la requête HTTP a quelques bizarreries, Volley a probablement un crochet pour vous. Si, par contre, vous avez une bizarrerie dans votre traitement des images, le seul crochet réel que vous avez est ImageCache . "Ce n’est pas rien, mais ce n’est pas beaucoup !, non plus". Cependant, une fois que vous avez défini vos demandes, leur utilisation depuis un fragment ou une activité est indolore, contrairement aux tâches parallèles AsyncTasks.

Avantages et inconvénients de Volley:

Alors, qu’est-ce qui est gentil avec Volley?

  • La partie réseau ne concerne pas uniquement les images. Volley est destiné à faire partie intégrante de votre dos. Pour un nouveau projet basé sur un simple service REST, cela pourrait être une grande victoire.

  • NetworkImageView est plus agressif que Picasso en ce qui concerne le nettoyage des demandes et plus conservateur dans ses modèles d'utilisation du GC. NetworkImageView repose exclusivement sur des références de mémoire fortes et nettoie toutes les données de la demande dès qu'une nouvelle demande est faite pour ImageView ou dès que cette ImageView quitte l'écran.

  • Performance. Ce billet n’évaluera pas cette affirmation, mais ils ont clairement pris soin d’être judicieux dans leurs habitudes d’utilisation de la mémoire. Volley s'efforce également de regrouper par lots les rappels vers le thread principal afin de réduire le changement de contexte.

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

  • Si vous utilisez des images compressées haute résolution, Volley est la seule solution qui fonctionne bien.

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

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

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

  1. Demandes en plusieurs parties (Solution: https://github.com/vinaysshenoy/enhanced-volley )

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

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

  3. c'est moins documenté mais beaucoup de personnes supportent volley dans github, Java comme on peut trouver de la documentation ici . Sur le site Web du développeur Android, vous pouvez trouver un guide pour Transmettre des données réseau à l'aide de Volley . Et le code source de volley peut être trouvé à Google Git

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

Vous pouvez aussi lire ceci Comparaison du chargement des images de Volley avec Picasso

Rénovation:

Il est publié par Square , Ceci offre une utilisation très facile de REST API (Mise à jour: voilà! Avec le support NIO)

Avantages de la modification:

  • Comparé à Volley, le code d'API REST de Retrofit est bref, fournit une excellente documentation sur l'API et offre 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 traitement des erreurs.

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

  • la version 1.6 de Retrofit with OkHttp 2.0 dépend maintenant de Okio pour prendre en charge Java.io et Java.nio qui facilite beaucoup l'accès, le stockage et le traitement de vos données en utilisant ByteString et Buffer pour faire des choses astucieuses pour économiser la CPU et Mémoire. (FYI: Cela me rappelle la bibliothèque de Koush avec la prise en charge de NIO!) Nous pouvons utiliser Retrofit avec RxJava pour combiner et chaîner REST appels à l'aide de rxObservables pour éviter les chaînes de rappel déplaisantes (pour éviter un rappel difficile !!).

Inconvénients de la modification pour la version 1.6:

  • La fonctionnalité de traitement des erreurs liées à la mémoire n’est pas satisfaisante (dans les anciennes versions de Retrofit/OkHttp), il n’était pas sûr qu’elle soit améliorée avec Okio avec le support de Java NIO.

  • Une assistance minimale de threading peut entraîner un rappel infernal si nous l'utilisons de manière inappropriée.

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

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

Mise à jour:

Tests de performance Android Async vs Volley vs Retrofit (millisecondes, une valeur inférieure est préférable):

Android Async vs Volley vs Retrofit performance benchmarks

(Les informations FYI ci-dessus, les informations sur les critères d'évaluation améliorés seront améliorées avec Java la prise en charge de NIO, car la nouvelle version de OKhttp dépend de la bibliothèque NIO Okio)]

Dans les trois tests avec des répétitions variables (1 à 25 fois), Volley était entre 50% et 75% plus rapide. La conversion a enregistré une vitesse impressionnante de 50% à 90% par rapport aux AsyncTasks, atteignant le même point de terminaison le même nombre de fois. Dans la suite de tests Dashboard, cela se traduisait par le chargement/l'analyse des données plusieurs secondes plus rapidement. C'est une différence énorme dans le monde réel. Afin de rendre les tests équitables, les temps pour AsyncTasks/Volley incluaient l’analyse JSON comme Retrofit le fait pour vous automatiquement.

RetroFit gagne le test de performance!

En fin de compte, nous avons décidé d’utiliser Retrofit pour notre application. Non seulement c'est ridiculement rapide, mais cela correspond bien à notre architecture existante. Nous avons pu créer une interface de rappel parent qui effectue automatiquement la gestion des erreurs, la mise en cache et la pagination sans effort important pour nos API. Pour fusionner dans Retrofit, nous avons dû renommer nos variables pour rendre nos modèles conformes à GSON, écrire quelques interfaces simples, supprimer des fonctions de l'ancienne API et modifier nos fragments pour ne pas utiliser AsyncTasks. Maintenant que nous avons quelques fragments complètement convertis, c’est assez simple. Nous avons dû surmonter des problèmes de croissance et des problèmes, mais dans l'ensemble, tout s'est bien passé. Au début, nous avons rencontré quelques problèmes techniques/bugs, mais Square possède une fantastique communauté Google+ capable de nous aider.

Quand utiliser Volley?!

Nous pouvons utiliser Volley lorsque nous avons besoin de charger des images et de consommer des API REST, système de mise en file d’appel réseau est nécessaire pour de nombreuses demandes n/w en même temps! Volley a également 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, regroupement de connexions, mise en cache disque, compression transparente! Récemment, il a reçu un support de Java NIO avec la bibliothèque Okio.

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

Remarque: À propos de la diffusion en continu, cela dépend du type de diffusion souhaité, comme RTSP/RTCP.

351
LOG_TAG

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 de Android que de Volley. Volley est basé sur les threads et ce n'est pas comme cela que le traitement en arrière-plan devrait se dérouler sous Android. En fin de compte, vous pouvez creuser les deux bibliothèques et constater qu’elles sont assez similaires, mais notre façon de traiter le traitement en arrière-plan est plus orientée Android, elle nous permet, par exemple, de dire aux utilisateurs que RS est en train de faire quelque chose. en arrière-plan, ce qui serait difficile pour la volée (en fait, ce n’est pas du tout le cas).
  • RoboSpice et volley offrent tous deux des fonctionnalités intéressantes telles que la définition des priorités, les stratégies de nouvelle tentative, les demandes d'annulation. Mais RS offre plus: une mise en cache plus avancée et une plus grande, avec gestion du cache, agrégation de demandes, fonctionnalités supplémentaires telles que le replugement d’une demande en attente, la gestion de l’expiration du cache sans recourir aux en-têtes de serveur, etc.
  • RoboSpice en fait plus en dehors du fil de l'interface utilisateur: volley désérialisera vos POJO sur le fil principal, ce qui est horrible pour moi. Avec RS, votre application sera plus réactive.
  • En termes de vitesse, nous avons absolument besoin de métriques. RS est maintenant très rapide, 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, retrofit, ormlite (beta), jackson, jackson2, gson, serializer xml, client google http, spring android ... Beaucoup. Volley peut être utilisé avec http http et utilise gson. c'est ça.
  • Volley offre plus de sucre UI que RS. Volley fournit NetworkImageView, RS fournit un adaptateur spicelist. En termes de fonctionnalités, ce n'est pas si loin, mais je pense que Volley est plus avancé sur ce sujet.
  • Plus de 200 bogues ont été résolus dans RoboSpice depuis sa publication initiale. Il est assez robuste et très utilisé en production. Volley est moins mature mais sa base d'utilisateurs devrait croître rapidement (effet Google).
  • RoboSpice est disponible sur maven central. Volley est difficile à trouver;)
44
Snicolas

AFNetworking pour Android:

Fast Android Networking est ici

Rapide Android La bibliothèque réseau prend en charge tous les types de requêtes HTTP/HTTPS telles que GET, POST, SUPPRIMER, HEAD, PUT, PATCH.

Rapide Android La bibliothèque réseau prend en charge le téléchargement de tout type de fichier

Rapide Android La bibliothèque réseau prend en charge le téléchargement de tout type de fichier (prend en charge le téléchargement en plusieurs parties)

Rapide Android La bibliothèque réseau prend en charge l'annulation d'une demande

Rapide Android La bibliothèque réseau prend en charge la définition d'une priorité pour toute demande (LOW, MEDIUM, HIGH, IMMEDIATE)

Rapide Android La bibliothèque réseau prend en charge RxJava

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

Rapide Android La bibliothèque réseau prend en charge HTTP/2 et permet à toutes les demandes adressées au même hôte de partager un socket.

Rapide Android La bibliothèque réseau utilise un pool de connexions qui réduit le temps de latence des demandes (si HTTP/2 n'est pas disponible)

GZIP transparent réduit la taille des téléchargements

Rapide Android La bibliothèque réseau prend en charge la mise en cache des réponses, ce qui évite complètement le réseau pour les demandes répétées

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

20
Amit Shekhar

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. Les performances sont meilleures que l’utilisation de l’utilitaire Vanilla Apache httpClient ou d’une connexion URL HTTP. Quoi qu'il en soit, la nouvelle version de la bibliothèque ne fonctionne pas pour moi: bibliothèque inter exception coupe la chaîne de rappels.

La lecture de 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 test, je vois clairement que le temps de réponse est descendu à 1.5x, 2x Volley.

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

18
Sergey Vakulenko

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

  1. Volley ne gère en aucun cas les envois en streaming. C'est-à-dire que le corps de la demande doit être entièrement en mémoire et que vous ne pouvez pas utiliser un OutputStream pour écrire le corps de la demande dans le socket sous-jacent, ni utiliser un InputStream pour lire le corps de la réponse. HttpURLConnection le fait. Volley est donc un mauvais choix pour télécharger ou télécharger des fichiers volumineux. Vos demandes et réponses devraient être petites. C'est l'une des plus grandes limites de Volley que j'ai personnellement rencontrée. Pour ce que ça vaut, OkHttp a des interfaces pour travailler avec des flux.

  2. L'absence de documentation officielle est agaçante, même si 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. Par conséquent, la gérer comme une dépendance devient plus un casse-tête que, par exemple, aucune des bibliothèques publiées par Square. . Vous venez de cloner un dépôt, de construire un pot et vous êtes seul. Vous cherchez un correctif de bogue? Allez chercher et espérons que c'est là. Vous pourriez aussi avoir d'autres choses. ça ne sera pas documenté. À mon avis, cela signifie effectivement que Volley est une bibliothèque tierce non prise en charge, même si la base de code est raisonnablement active. Caveat emptor.

  3. En tant que nit, avoir le type de contenu lié au type de classe/demande (JsonObjectRequest, ImageRequest, etc.) est un peu gênant et réduit un peu la flexibilité du code d'appel, car vous êtes lié à la hiérarchie de types de demandes existante de Volley. J'aime la simplicité qui consiste à définir Content-Type comme un en-tête comme un autre (ne faites pas ceci avec Volley, soit dit en passant; vous allez vous retrouver avec deux en-têtes Content-Type!). Ce n'est cependant que mon opinion personnelle et il est possible de contourner le problème.

Cela ne veut pas dire que Volley ne possède pas certaines fonctionnalités utiles. C'est certainement le cas. Des stratégies de 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 d'excellentes fonctionnalités. Sachez simplement qu'il n'est pas prévu pour tous les cas d'utilisation HTTP (voir le point 1 ci-dessus) et que la mise en production de Volley dans votre application pose des problèmes.

11
Jeff

J'ai récemment trouvé une bibliothèque appelée ion qui apporte un petit extra à la table.

ion dispose d’un support intégré pour le téléchargement d’image intégré à ImageView, JSON (avec l’aide de GSON), de fichiers et d’un support très pratique pour le filetage de l’interface utilisateur.

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.

9
Tiago Gaspar

En ajoutant à la réponse acceptée et ce que LOG_TAG a dit .... pour que Volley analyse vos données dans un fil d’arrière-plan, vous devez sous-classe Request<YourClassName> car la méthode onResponse est appelée sur le fil principal et analysée sur le fil principal. Un thread peut entraîner un décalage de l'interface utilisateur si votre réponse est grande. Lisez ici sur comment faire cela.

4
upenpat

Retrofit 1.9.0 vs. RoboSpice

J'utilise les deux dans mon application.

Robospice fonctionne plus rapidement que Retrofit chaque fois que j'analyse la classe JSON imbriquée. Parce que Spice Manger fera tout pour vous. Dans Retrofit, vous devez créer GsonConverter et le désérialiser.

J'ai créé deux fragments dans la même activité et appelé la même heure avec deux mêmes types d'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
Asthme

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

  • Il est modulaire comme Volley, mais plus étendu et la documentation s’améliore, prenant en charge différentes piles HTTP et convertisseurs prêts à l’emploi.
  • Il a un module pour générer des mappages d’interface API de serveur comme Retrofit
  • Il prend également en charge JavaRx

Et de nombreuses autres fonctionnalités utiles comme les marqueurs, les transformateurs, etc.

2
djodjo