IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Arrêt AsyncTask et HttpRequest


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut Arrêt AsyncTask et HttpRequest
    Bonjour,

    Je récupère des donnnées Json grâce à la classe JsonParser ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class JSONParser {
     
     
       public static JSONObject getJSONFromPost(String url) throws MalformedURLException, IOException, JSONException, ClientProtocolException, IllegalStateException {
           HttpGet httpPost = new HttpGet(url);
           return getJSONFrom(httpPost);
       }
     
       public static JSONObject getJSONFrom(HttpUriRequest req) throws ClientProtocolException, IOException, JSONException, IllegalStateException
       {
     
    	DefaultHttpClient httpClient = new DefaultHttpClient();
     
     
    	HttpResponse httpResponse = httpClient.execute(req);
     
     
           if (httpResponse.getStatusLine().getStatusCode()>=400) 
               throw new IOException(httpResponse.getStatusLine().getReasonPhrase());
     
    	HttpEntity httpEntity = httpResponse.getEntity();
     
           String jsonStr = EntityUtils.toString(httpEntity);
     
           return new JSONObject(jsonStr);
       }
     
    }
    ... dans mon Asyntask


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    private class MyTask extends AsyncTask<Void, Void, ArrayList<Video>> {
     
    		private String URL_task = "";
    		private JSONObject json = null;
    		private String error = null;
                    private boolean isRunnig = true;
     
     
                    @Override
    		protected ArrayList<Video> doInBackground(Void ...unused) {
     
    			while (isRunnig) 
    			{
     
     
    			URL_task = PATH_TO_SCRIPT;
     
     
    			try {
     
    				json = JSONParser.getJSONFromPost(URL_task);
     
    				JSONArray earthquakes = json.getJSONArray("videos");
     
    				nb_articles = earthquakes.length();
     
    				for (int i = 0; i < earthquakes.length(); i++) 
    				{
    					JSONObject e = earthquakes.getJSONObject(i);
    					Video video = new Video(e.getString("id_video"));
    					listVideos.add(video);
     
    				}
     
    			} catch (Exception ex) {
     
    				error = "Couldn't retrive data !";
     
    				Log.e("Json", error, ex);
     
    			}
     
    				isRunnig = false;
     
    				if (isCancelled())
    				{
    				Log.e("asyntask", "isCancelled()");
    				break;
    				}
    		    }
     
    			return listVideos;
     
                       } 
     
    		protected void onPostExecute(ArrayList<Video> result) {
     
    			mTask = null;
     
    			if(error != null)
    			Toast.makeText(getActivity(), error, Toast.LENGTH_SHORT).show();
     
     
    			else {
    			           // TRAITEMENT NORMAL DE MA LISTE	
     
                                   }
     
    		} // onPostExecute();
     
     
    		 @Override
    		 public void onCancelled ()
    		 {
    			 isRunnig = false;
    		 }
     
    	}
    Ma question est la suivante pourquoi quand j’exécute le code suivante pour fermer correctement mon asynctask:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (mTask != null)
    mTask.cancel(true);
    (où mTask est de type MyTask ) dans mon onDestroy() / onPause() ma requête HTTP continue de tourner. J'ai vue qu'il fallait utiliser un "abort" mais je ne vois pas l'utiliser dans mon cas. Merci d'avance pour votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne comprends pas trop l'interêt du "whille (isRuning)" vu qu'on ne passe dans le test que deux fois: la première au début (isRuning toujours vrai) la deuxieme à la fin (isRuning toujours faux), avec au passage un "break;" du coup inutile...

    Il me semble qu'un simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    protected ArrayList<Video> doInBackground(Void ...unused) {
        if (!isCancelled()) {
                URL_task = PATH_TO_SCRIPT;
                try {
                     json = JSONParser.getJSONFromPost(URL_task);
                     JSONArray earthquakes = json.getJSONArray("videos");
                     nb_articles = earthquakes.length();
                     for (int i = 0; i < earthquakes.length(); i++)  {
                           JSONObject e = earthquakes.getJSONObject(i);
                           Video video = new Video(e.getString("id_video"));
                           listVideos.add(video);
                      }
                 } catch (Exception ex) {
                        error = "Couldn't retrive data !";
                        Log.e("Json", error, ex);
                 }
          }
          return listVideos;
    }
    Suffirait... D'autant que "onCancelled()" n'est appelé *que* quand le doInBackground est revenu ! Donc son utilité ici très relative !

    Si il y a du "travail" à effectuer pour fermer la tâche, il suffit de surcharger "cancel" (attention aux synchronisations entre tâches quand même).

    Pour le coup, ici, le traitement additionnel semble vraiment compter pour du beurre face à la requête HTTP, donc c'est elle qui doit être stopée.

    Hors cette requête (comme toutes les requêtes IO) "attends" des données ("wait") 90% du temps. Donc bien utiliser cancel(true) pour immédiatement interrompre les attentes d'IO.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Merci pour votre explication. Cependant comme vous le dites la méthode onCancelled() n'est appelé *que* lorsque le doInBackground est terminée donc je ne peux pas appeler mon "abort" dans onCancelled() car la requête se sera exécutée.

    Si il y a du "travail" à effectuer pour fermer la tâche, il suffit de surcharger "cancel" (attention aux synchronisations entre tâches quand même).
    De plus on ne peut pas surcharger la méthode cancel() de AsyncTask puisque c'est une final méthode.

    Je ne vois vraiment pas comment arrêter ma requête HTTP dès le déclenchement du cancel(true)

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Rajouter des if(isRunnig)return ou break; entre +- chaque ligne de ton doInBackGround.

    Tant que tu ne sors pas de ta procédure, il ira jusqu'au bout... même si tu finis ton activité.

    Je ne sais pas si c'est propre mais bon...

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le plus important est surtout d'appeler "cancel(true)"

    Ou sinon si on "sait" qu'un a une tâche spécifique, faire une fonction qui fait "abort" (même si je n'en vois pas l'utilité) puis appele le cancel().
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Problème arrêt d'AsyncTask
    Par adteulade dans le forum Android
    Réponses: 8
    Dernier message: 14/05/2012, 09h41
  2. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  4. [MFC] Attendre l'arrêt d'un processus !!
    Par Djoz dans le forum MFC
    Réponses: 6
    Dernier message: 29/07/2003, 12h03
  5. Détecter l'arrêt du système ?
    Par Jéremy A dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 24/03/2003, 19h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo