2012-08-24 2 views
4

J'ai implémenté les 2 tâches asynchrones, j'utilise android4.0. Lorsqu'un asyntask est exécuté en continu, le second est exécuté en fonction de l'exigence (peut être plusieurs fois). Par exemple.exécuter la tâche asynchrone dans l'ordre série dans android4.0

class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{ 
    protected Void doInBackground(Void... params) { 
     while(true){ 
      publishProgress(bmp); 
     } 
    } 
} 

class AsynTask2 extends AsyncTask<String, Void,Void>{ 
    protected Void doInBackground(String... params){ 
     System.out.println(params[0]) 
    } 
} 

Dans la classe d'activité

class MainActivity extends Activity{ 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new AsynTask1().execute(); 

     int i=0; 
     while(i<100) 
     { 
      if(i%2==0) 
      new AsynTask2().execute("no is even"+i); 
      i++ 
     } 
    } 
}  

Dans le cas au-dessus du AsynTask2 n'est pas exécutée.

Si essayé avec executeOnExecutor (AsyncTask.THREAD_POOL_Executor, params), alors les deux asyntask sont exécutés et j'obtiens les messages d'impression de l'AsynTask2, mais ceux-ci ne sont pas dans l'ordre (comme 0 2 6 4 10 8 12 14 .. ..).

Y a-t-il un moyen d'exécuter AsynTask1 en continu et AsynTask2 dans l'ordre séquentiel afin que l'ordre (comme 0 2 4 6 8 10 12 14 ....) soit empêché.

Merci & Cordialement mini.

Répondre

4

Utilisez SERIAL_EXECUTOR pour Asynctask2

new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i) 

Edit: utilisation pour Asynctask1, de sorte que même exécuteur testamentaire n'est pas utilisé

new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params); 
+0

J'ai essayé avec ceci, mais le AsyncTask2 n'est pas exécuté de sorte que je ne reçois pas les messages de l'AsynTask2. ThreadPool est-il identique pour tous les asyntasks? – mini

+0

avez-vous fait cela uniquement pour Asynctask2 ou même pour asynctask1? – nandeesh

+0

J'ai essayé ceci pour les deux AsynTasks, plus tard j'ai essayé seulement AsynTask2. – mini

0

Essayez d'utiliser les rappels. Définissez les interfaces dans vos classes AsyncTask et implémentez-les dans la classe principale. Utilisez le callBack sur onPostExecute de AsyncTask2 pour lancer le prochain AsyncTask2. Vous garantirez la commande.

class AsyncTask2 extends AsyncTask<String, Void,Boolean<{ 
     //Your code. doInBackground must now return a boolean. 
     protected Void onPostExecute(final Boolean success){ 
      myCallback listener = (myCallback) parentActivity; 
      listener.call(); 
     } 

     public Interface myCallback{ 
      void call(); 
     } 
} 

Et puis sur votre activité principale, vous implémentez myCallback.

[EDIT]

Voici un échantillon de ce que vous pourriez faire.

Class MainActivity extends Activity implements myCallback{ 
    //Your code 
    public void call(){ 
     new AsyncTask2().execute("no is even" + i); 
    } 
} 
+0

Merci pour votre réponse, mais je ne sais pas les callbacks et leur implémentation. – mini

+0

Vérifiez la modification. –

-2
int i=0; 
    while(i<100) 
    { 
     new AsynTask1().execute(); 
     if(i%2==0) 
     { 
     new AsynTask2().execute("no is even"+i); 
     } 
     i++ 
    } 
+0

Si j'utilise celui ci-dessus, alors AsynTask1 est appelé pour chaque itération, je ne veux pas appeler AsynTask1 pour chaque itération. – mini

0
  1. Vous n'êtes pas censé utiliser AsyncTa sk pour les threads de longue durée (comme vous implémentez AsyncTask1). Voir la documentation: http://developer.android.com/reference/android/os/AsyncTask.html. Créez simplement un thread séparé pour ce que fait AsyncTask1.

  2. Puisque vous avez besoin pour une exécution en série ce que vous faites dans AsyncTask2 peut être fait en créant un ThreadPool de taille 1.

    // Creating ThreadPool 
    ExecutorService service = Executors.newFixedThreadPool(1); 
    
    // Submitting task 
    service.execute(task); 
    
    // Shutting down the thread pool when not required. 
    service.shutdown(); 
    
Questions connexes