91 votes

Attendre que la tâche asynchrone termine son travail

Je suis très novice en matière de programmation et j'ai quelques doutes.

J'ai un AsyncTask ce que j'appelle RunInBackGround .

et je commence ce processus comme :

new RunInBackGround().execute();

Mais je souhaite attendre que cet appel ait fini de s'exécuter, avant de passer aux autres instructions du code.

Comment puis-je faire ça ?

Y a-t-il un moyen de le faire ?

137voto

ρяσѕρєя K Points 51253

attendez que cet appel finisse de s'exécuter

Vous devrez appeler AsyncTask.get() pour récupérer le résultat et attendre jusqu'à ce que doInBackground l'exécution n'est pas terminée, mais Cela va geler le thread principal de l'interface utilisateur si vous n'appelez pas la méthode get à l'intérieur d'un thread. .

Pour récupérer le résultat dans Fil conducteur de l'interface utilisateur commencer AsyncTask comme :

String str_result= new RunInBackGround().execute().get();

38voto

Stefan de Bruijn Points 3863

Bien qu'il soit préférable que votre code s'exécute en parallèle, il peut arriver que vous utilisiez simplement un thread pour ne pas bloquer le thread de l'interface utilisateur, même si le flux d'utilisation de votre application doit l'attendre.

Vous avez à peu près 2 options ici ;

  1. Vous pouvez exécuter le code que vous voulez en attente, dans l'AsyncTask lui-même. S'il s'agit de mettre à jour l'interface utilisateur (thread), vous pouvez utiliser la méthode onPostExecute. Celle-ci est appelée automatiquement lorsque votre travail en arrière-plan est terminé.

  2. Si, pour une raison ou une autre, vous êtes obligé de le faire dans l'activité, le fragment ou autre, vous pouvez également créer un écouteur personnalisé, que vous diffusez depuis votre AsyncTask. En utilisant cette méthode, vous pouvez avoir une méthode de rappel dans votre Activity/Fragment/Whatever qui n'est appelée que lorsque vous le souhaitez : c'est-à-dire lorsque votre AsyncTask a terminé ce que vous deviez attendre.

16voto

BaZinga Points 2889

Dans votre AsyncTask ajouter un ProgressDialog comme :

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

vous pouvez définir le message dans onPreExecute() méthode comme :

this.dialog.setMessage("Processing..."); 
this.dialog.show();

et dans votre onPostExecute(Void result) rejette votre ProgressDialog .

16voto

Nepster Points 893

AsyncTask ont quatre méthodes..

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.

vous pouvez appeler votre travail sur onPostExecute() qu'il appelle après être revenu de doInBackground()

onPostExecute est ce que vous devez mettre en œuvre.

1voto

Nearyuk Points 137

Je pense que le moyen le plus simple est de créer une interface pour obtenir les données de onpostexecute et de lancer l'interface utilisateur à partir de l'interface :

Créer une interface :

public interface AsyncResponse {
    void processFinish(String output);
}

Puis en asynchrone

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

Puis dans votre activité principale

@Override
public void processFinish(String data) {
     // do things

}

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