2011-04-23 4 views
1

J'utilise un Asynctask comme contrôleur de boucle pour un jeu et j'ai remarqué que le thread créé continuait de tourner une fois l'activité terminée.Comment annuler un AsyncTask

Je me suis rendu compte que c'était le comportement correct d'un thread séparé, puis j'ai essayé de chercher des réponses sur la façon de terminer le thread lorsque l'application entre dans OnPause.

J'ai trouvé beaucoup de questions similaires, mais pas de réponses directes, mais j'ai finalement trouvé une méthode, je vais donc répondre à ma propre question ici pour aider les autres à l'avenir. (Et pour recevoir des améliorations à ma réponse aussi bien)

Répondre

2

Tout d'abord, AsyncTask ont une méthode entièrement valide cancel(). Deuxièmement, ne pas utiliser unAsyncTask pour une boucle de jeu appropriée. AsyncTask n'est pas pour des opérations de longue durée.

Par conséquent, ignorez AsyncTask pour votre boucle de jeu et apprenez comment gérer correctement la mise en pause/reprise dans un Thread par reading another answer from me here on SO.

+0

AsyncTask a une méthode cancel() entièrement valide, mais je ne peux pas trouver une documentation claire sur la façon de l'utiliser :) En tant que passionné à temps partiel à moins que vous allez me montrer que comment vraiment de mauvaises choses vont arriver à mon application si j'utilise Asynctask comme un simple contrôleur de boucle je vais l'utiliser comme un moyen facile de faire un fil de boucle de jeu :) Je pense que je vais très bien en suivant "les règles" en ayant même un fil séparé :) – SimpleSi

+0

Le problème lorsque vous invoquez 'cancel()' sur votre 'AsyncTask' est qu'une fois que vous reprenez votre jeu, vous devez recommencer en créant une nouvelle' AsyncTask'. C'est une mauvaise pratique, en particulier dans le développement de jeux. Bien que, si vous voulez l'avoir comme ça, voici une bonne réponse sur la façon dont vous pouvez annuler un 'AsyncTask'. http://stackoverflow.com/questions/5513855/android-asyntask-with-progress-dialog-cancel/5513904#5513904 – Wroclai

+0

Peut-être que j'ai posé la mauvaise question :(Dans mon code, je lance task.cancel (true) dans OnPause mais l'AsyncTask ne se termine pas et je reçois donc un autre thread en cours d'exécution la prochaine fois que je lance l'application :(Donc, j'ai dû inclure une vérification de this.isCancelled dans mon Asynctask – SimpleSi

0
public class CamOverlayTest extends Activity { 
//... 
public static BackgroundLoop BackgroundLoopTask; 
//... 

@Override 
protected void onResume() { 
    //... 

    BackgroundLoopTask = new BackgroundLoop(); 
    BackgroundLoopTask.execute(); 


} 

@Override 
protected void onPause() { 
    //... 
    BackgroundLoopTask.cancel(true); 
} 

private class BackgroundLoop extends AsyncTask<Void,Integer,Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     int count =0; 

     while (!this.isCancelled()) { 
     // Basically, this is where the loop checks if the Aysnctask has been asked to be 
     // cancelled - if so - it exits. 
      try { 
       Thread.sleep(1000); 
       updatePhysics(count); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      count +=1; 
      Log.i("SW","Count: "+count); 
      publishProgress(); 

     } 
     return true; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // swDrawOnTop is my view 
     swDrawOnTop.invalidate(); 
    } 
//... 

}

Questions connexes