42 votes

Existe-t-il une meilleure pratique acceptée pour effectuer des requêtes HTTP asynchrones dans Android ?

J'ai vu un grand nombre d'exemples et ils semblent tous résoudre ce problème différemment. En gros, je veux simplement trouver le moyen le plus simple de faire une demande qui ne verrouille pas le thread principal et qui puisse être annulée.

Le fait que nous ayons (au moins) deux bibliothèques HTTP parmi lesquelles choisir, java.net.* (comme HttpURLConnection) et org.apache.http.*, n'aide pas non plus.

Y a-t-il un consensus sur la meilleure pratique à adopter ?

35voto

jargonjustin Points 1449

Le SDK Android 1.5 a introduit une nouvelle classe, AsyncTask conçu pour simplifier un peu l'exécution de tâches sur un thread d'arrière-plan et la communication du résultat au thread de l'interface utilisateur. Un exemple donné dans le Blog des développeurs Android donne l'idée de base sur la façon de l'utiliser :

public void onClick(View v) {
   new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask {
   protected Bitmap doInBackground(String... urls) {
      return loadImageFromNetwork(urls[0]);
   }

   protected void onPostExecute(Bitmap result) {
      mImageView.setImageBitmap(result);
   }
}

El doInBackgroundThread est appelée sur un thread séparé (géré par un pool de threads). ExecutorService ) et le résultat est communiqué à l onPostExecute qui est exécutée sur le fil d'exécution de l'interface utilisateur. Vous pouvez appeler cancel(boolean mayInterruptIfRunning) sur votre AsyncTask pour annuler une tâche en cours.

Quant à l'utilisation de la java.net o org.apache.http bibliothèques pour l'accès au réseau, c'est vous qui décidez. J'ai trouvé les java.net les bibliothèques sont très agréables à utiliser lorsqu'il s'agit simplement d'émettre une carte de crédit. GET et lire le résultat. Le site org.apache.http vous permettront de faire pratiquement tout ce que vous voulez avec HTTP mais ils peuvent être un peu plus difficiles à utiliser et je les ai trouvés moins performants (sur Android) pour des applications simples. GET demandes.

12voto

Snicolas Points 19644

En fait, il y a quelques défauts dans la conception d'AsyncTasks qui l'empêchent d'être vraiment utilisable pour les réseaux. Un exemple simple est que vous perdrez le lien entre votre AsyncTask et votre Activity ... simplement en tournant votre appareil.

Jetez un coup d'œil à ce fil vous verrez qu'AsyncTask crée aussi très facilement des fuites de mémoire.

La documentation d'AsyncTask est claire à ce sujet : AsyncTask ne doit être utilisé que pour des tâches de courte durée et, de toute évidence, les réseaux n'appartiennent pas à cette catégorie.

Donc, je vous suggère vraiment de jeter un coup d'oeil à RoboSpice . Cette bibliothèque a été conçue pour les réseaux asynchrones et constitue un moyen très robuste de les mettre en œuvre. Si vous n'avez que quelques secondes pour être convaincu, regardez ceci inforgraphiques .

RoboSpice est également disponible en tant qu'application de démonstration sur la boutique : Motivations de RoboSpice qui expliquera tout, en profondeur, sur la mise en réseau asynchrone sur Android.

1voto

PaN1C_Showt1Me Points 4153

Qu'en est-il d'un AsyncTask avec une référence à un static retained Fragment (sans interface utilisateur) hébergé dans une activité ou un autre fragment ? Pas de fuites de mémoire, opérations asynchrones élégantes dans un thread séparé, pas de pertes de références d'objets.

Je pense que cela serait correct pour les requêtes http, mais pas pour les téléchargements de fichiers. Si vous lisez attentivement, il y a une phrase :

Si vous devez maintenir des threads en cours d'exécution pendant de longues périodes, il est fortement recommandé d'utiliser les diverses API fournies par le paquet java.util.concurrent telles que Executor, ThreadPoolExecutor et FutureTask.

Mais ils ne mentionnent pas, qu'un service avec un fil séparé pourrait aussi être une bonne option. Cela permet de continuer à exécuter les tâches en arrière-plan, quoi que fasse l'utilisateur. (par exemple, s'il télécharge un fichier, vous ne voulez pas l'arrêter parce qu'il a quitté l'activité).

Ce site link pour les échantillons - trouvez le RetainedFragment.java

Ce site link pour AsyncTask.

-1voto

Ashish Vora Points 476

Vous pouvez utiliser Async Task pour Android. Pour effectuer une requête http, vous pouvez utiliser la classe HttpURLConnection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X