2013-02-14 3 views
1

Je fais une application qui utilise le nouveau Google Maps V2, lorsque la caméra de carte se déplace, j'ai besoin de recharger les points à la nouvelle position de la caméra, je le fais avec une asynctask.Comment annuler une asyncTask et l'exécuter plusieurs fois?

Le problème est que lorsque je déplace la position de la caméra plusieurs fois, l'application charge les points plusieurs fois. Donc, j'annule la tâche asynchrone quand la caméra est déplacée et je ne charge pas de nouveau point tant que la tâche n'est pas annulée. J'ai une boucle vide pour le faire, Y at-il une meilleure solution pour le faire?

// LOAD NEW POIS ASYNC 
private void updatePoisInMap(){ 

    .... 

    if (refresh_pois_async != null) { 
     refresh_pois_async.cancel(true); 
     while (!refresh_pois_async.isCancelled()) { 
     }  
    } 
    refresh_pois_async = new RefreshPoisAsync().execute(lowerLeftCorner, topRightCorner); 
} 

Répondre

0

En fait, je ne pense pas que votre boucle while fonctionnera, ou du moins pas comme vous le souhaiteriez. La méthode AsyncTask.isCancelled() est normalement utilisée à l'intérieur de la méthode doInBackground(), pour prendre en charge l'annulation anticipée. Vous avez plusieurs options pour faire ce que vous voulez:

  • remplacez la méthode onCancelled() de votre AsyncTask. Ceci est garanti d'être appelé sur le thread principal lorsque votre doInBackground() est terminé et que vous avez appelé cancel() au préalable sur votre tâche. Dans votre onCancelled() vous pouvez alors démarrer une nouvelle asyncTask. Utilisez le isCancelled() dans doInBackground de votre tâche() pour la sortie anticipée, comme décrit ci-dessus.
  • n'annule pas la tâche en cours, mais la laisse s'exécuter. En attendant, l'utilisateur peut déplacer la carte plusieurs fois. Tant qu'une tâche est en cours d'exécution, définissez simplement un drapeau qui doit être réexécuté. À la fin de la tâche (override onPostExecute() dans votre AsyncTask) vérifiez l'indicateur et recommencez s'il a été défini.
  • combinez ce qui précède pour trouver le juste équilibre entre la réactivité (commencer à charger les bons POI assez rapidement) et le sur-traitement (ne pas démarrer à chaque fois, mais attendre que l'utilisateur arrête de défiler).
Questions connexes