54 votes

Comment exécuter la même asynchronie plus d'une fois ?

Ma tâche asynchrone s'exécute lorsque l'activité démarre, puis si la connectivité réseau n'est pas disponible, j'ai un bouton de rafraîchissement qui essaie d'exécuter la tâche asynchrone pour réessayer. Mais je reçois une erreur de débogage disant ceci

07-29 18:14:21.290: ERROR/AndroidRuntime(9080): FATAL EXCEPTION: main
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
   07-29 18:14:21.290: ERROR/AndroidRuntime(9080):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:541)
   07-29 18:14:21.290: ERROR/AndroidRuntime(9080):     at android.os.AsyncTask.execute(AsyncTask.java:499)
  07-29 18:14:21.290: ERROR/AndroidRuntime(9080):     at com.fttech.gameIT.MainMenu$1.onClick(MainMenu.java:90)

Y a-t-il un moyen de l'exécuter deux fois ?

79voto

Cristian Points 92147

Il suffit de créer une autre instance et de l'exécuter.

0 votes

Je sais, mais que se passe-t-il si l'utilisateur clique plusieurs fois sur le bouton ? Dans ce cas, il n'excute qu'une fois et force la fermeture après le deuxième clic.

4 votes

Désactiver le bouton jusqu'à ce que le AsyncTask revient ? BTW c'est la bonne approche, une nouvelle AsyncTask doit être créé.

0 votes

En faire un singleton if (task != null then) faire et exécuter la tâche

37voto

Ragunath Jawahar Points 6124

Tout comme les fils, AsyncTask ne peuvent pas être réutilisés. Vous devez créer une nouvelle instance chaque fois que vous voulez en exécuter une.

18voto

Oscar Gomez Points 12966

Vous ne pouvez plus jamais exécuter un thread, ni dans Java pas dans une autre langue, une fois que le fil est terminé avec le run() vous ne pouvez pas le redémarrer, c'est pourquoi vous obtenez l'erreur suivante IllegalStateException .

Vous pouvez cependant toujours appeler les méthodes sur ce thread, mais elles seront exécutées sur le thread qui les appelle. PAS sur un autre fil de discussion . Vous devrez donc en créer un nouveau.

0 votes

Hmmm....Eh bien, ça ne marcherait pas... Parce que le onClick... Disons que si l'utilisateur continue à cliquer dessus... Il s'exécutera une fois et donnera une erreur de fermeture forcée... Y a-t-il un moyen d'avoir un bouton qui ferme une application et la rouvre ensuite ? Ou recharger une activité ?

0 votes

@Coder_For_Life22 La façon dont les doubles clics sont traités consiste à ignorer tout autre clic sur le bouton et à modifier son apparence, une fois qu'il a été cliqué une fois.

0 votes

Je ne comprends pas ce que vous voulez dire.

9voto

Kaps Points 225

Vous ne pouvez pas exécuter la même instance d'une AsyncTask plus d'une fois. Supposons que vous ayez une AsyncTask nommée MyAsyncTaks et que vous ayez l'intention de faire quelque chose comme ceci,

    MyAsyncTask myAsyncTask = new MyAsyncTaks();
    myAsyncTask.execute(); // Works as expected
    .
    .
    .
    .
    myAsyncTask.execute(); // This will throw you exception

La raison en est qu'un thread, une fois qu'il a terminé sa méthode d'exécution, ne peut plus être affecté à une autre tâche. Ici, à la première invocation de execute(), votre AsyncTask a commencé à s'exécuter. après avoir fait son travail, le thread sort de l'exécution. Naturellement, l'invocation suivante de execute() vous enverra une exception.

La façon la plus simple d'exécuter cette opération plusieurs fois est de créer une nouvelle instance de MyAsyncTaks et d'appeler execute sur celle-ci.

    MyAsyncTask myAsyncTask = new MyAsyncTaks();
    myAsyncTask.execute(); // Works as expected
    .
    .
    .
    MyAsyncTask myAsyncTask2 = new MyAsyncTaks();
    myAsyncTask2.execute(); // Works as expected

Bien que cela ne soit pas nécessaire de le mentionner ici, il faut savoir qu'après la version Honeycomb du SDK Android, si vous exécutez plus d'une AsyncTask à la fois, elles s'exécutent en fait séquentiellement. Si vous voulez les exécuter parallèlement, utilisez plutôt executeOnExecutor.

1 votes

Volonté myAsyncTask = new MyAsyncTaks(); et ensuite myAsyncTask.execute(); travail ?

4voto

Bobbake4 Points 6297

Il suffit de faire un nouvel appel comme new asyncTask().execute() ; Vous devez créer un nouvel objet pour redémarrer cette tâche.

0 votes

@Darrell : pas utile, à moins que vous ne décriviez plus en détail ce que vous avez fait, et ce qui n'a pas marché.

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