2012-04-23 5 views
6

J'ai besoin de combiner deux listes dont chacune est retournée après son propre appel asynchrone séparé. Comment peut-on mieux coordonner les appels asynchrones comme ceux-ci. Existe-t-il des méthodes SDK standard pour attendre qu'une autre tâche asynchrone soit terminée?Android Comment synchroniser deux tâches asynchrones?

+0

Qu'en est-il de combiner le travail des deux asynctasks en un seul? – dmon

+0

Ou utilisez AsyncTask.executeOnExecutor (singleThreadPoolExecutor) pour gérer l'exécution de la mise en file d'attente. – yorkw

Répondre

0

Java a quelques trucs sympas comme Future class et les goûts. Il n'est pas utile de décrire ce cadre ici, il y a beaucoup de ressources sur le net. Il est peut-être préférable d'avoir une seule tâche asynchrone, de toute façon il n'est pas vraiment nécessaire d'exécuter deux tâches asynchrones en même temps. Vous pouvez faire les deux parties en une seule doInBackground

5

execute() appel renvoie une instance de AsyncTask, vous pouvez enregistrer cette instance pour vérifier plus tard, si la tâche est terminée ou non en appelant getStatus(), donc votre code ressemblera à ceci:

final AsyncTask<...> first_task; 
final AsyncTask<...> second_task; 

public someMethod() { 
    first_task = new MyFirstAsyncTask().execute(); 
    second_task = new MySecondAsyncTask().execute(); 
    // other things 
} 

private class MyFirstTask extends AsyncTask<...> { 
    // business as usual 

    protected void onPostExecute(SomeData[] result) { 
     if(second_task != null && second_task.get_status() == AsyncTask.Status.FINISHED) { 
      // start the task to combine results 
      .... 
      // 
      first_task = second_task = null; 
     } 
    } 
} 

private class MySecondTask extends AsyncTask<...> { 
    // business as usual 

    protected void onPostExecute(SomeData[] result) { 
     if(first_task != null && first_task.get_status() == AsyncTask.Status.FINISHED) { 
      // start the task to combine results 
      .... 
      // 
      first_task = second_task = null; 
     } 
    } 
} 

et la tâche, qui se termine en dernier, peut démarrer la nouvelle tâche pour combiner les résultats.

0

Cela dépend vraiment du besoin.

Avez-vous besoin d'attendre toutes les données pour arriver? Si ce n'est pas le cas, appelez votre fonction avec la fonction de bloc synchronisé dans votre activité

Si oui, vous attendez-vous à ce qu'ils ne fonctionnent qu'une seule fois; donc deux (ou X) au total? peut-être vous pouvez vérifier: CoundDownLacth (http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html)

Questions connexes