web-dev-qa-db-fra.com

En utilisant OKHttp, quelle est la différence entre une demande synchrone dans AsyncTask et une demande asynchrone OKhttp?

OKHttp prend en charge à la fois api synchrone et asynchrone . Si je souhaite émettre une demande asynchrone, je peux:

  1. Utilisez une AsyncTask et émettez une API synchrone OKhttp.
  2. Émettez une API asynchrone OKhttp.

Quelle est la différence entre ces 2 options? Et lequel est le meilleur?

29
NeoWang

Beaucoup diffère!

L'utilisation de AsyncTask pour les requêtes HTTP est à peu près l'une des pires choses que vous puissiez faire sur Android. Il est semé d'embûches et de problèmes qu'il vaut mieux éviter inconditionnellement. Par exemple, vous ne pouvez pas annuler une demande pendant l'exécution. Les schémas d'utilisation de AsyncTask fuient également fréquemment une référence à un Activity, un péché cardinal de Android development.

L'async d'OkHttp est largement supérieur pour de nombreuses raisons:

  • Il prend en charge l'annulation native. Si une demande est en cours, la référence au Callback est libérée et ne sera jamais appelée. De plus, si la demande n'a pas encore démarré, elle ne sera jamais exécutée. Si vous utilisez HTTP/2 ou SPDY, nous pouvons effectivement annuler la bande passante et l'énergie économisées à la mi-demande.
  • Il prend en charge le balisage de plusieurs demandes et les annule toutes avec un seul appel de méthode. Cela signifie que chaque demande que vous faites dans, disons, un Activity peut être balisée avec l'instance Activity. Ensuite, dans onPause ou onStop, vous pouvez annuler toutes les demandes marquées avec l'instance Activity.
  • Si vous utilisez des requêtes HTTP/2 ou SPDY et que les réponses sont multiplexées sur une seule connexion au serveur distant et en utilisant le mécanisme asynchrone Call, cela est beaucoup plus efficace que la version bloquante.

Donc, si vous le pouvez, utilisez Call.enqueue!

60
Jake Wharton

Pas grand chose. OKHttp async est piloté par l'API OKHttp. Donc, tant que vous regroupez les pots pour toutes les plates-formes, vous devriez être bon. AsyncTask est Android façon de faire les choses.

Cependant, puisque la tâche Honeycomb Async exécute les tâches séquentiellement et non en parallèle. Cela signifie que bien que la méthode d'exécution d'AsyncTask couvre un nouveau thread qui exécute votre travail à partir du thread d'interface utilisateur, mais toutes les tâches envoyées à un AsyncTask s'exécutent dans le même thread fractionné.

Donc, pour 3 tâches soumises, vous n'obtenez pas 3 threads, ils s'exécutent tous de manière séquentielle sur un seul thread fractionné. Avec OKHttp, vous pouvez obtenir un véritable parallélisme en utilisant les rappels et les asynchrones GET et POST.

Bien que vous puissiez également faire un vrai parallélisme dans les méthodes AsyncTask (vérifiez les méthodes d'exécution surchargées dans AsyncTask), mais le comportement par défaut Android Android ne le fait pas).

1
Nazgul