2017-09-18 3 views
1

J'utilise plusieurs classes de spinner dans mon application Android, comme pays, état, ville.Appel de tâches asynchrones l'une après l'autre pour des appels de service Web en passant des valeurs provoquant l'échec de l'application

Le changement de fileur pays, l'État doit être chargé et sur le changement d'état , la ville doit être chargée

.Depuis Je fais REST appel à charger les combos, je besoin d'aller avec des tâches AsyncTask.

Comment appeler tâches asysnc l'un après l'autre depuis que je dois passer une valeur de Async Task1 à Async Tâche 2.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_load_location); 
     runMultipleAsyncTask(); 


    } 
    private void runMultipleAsyncTask() // Run Multiple Async Task 
    { 
     LoadCountryJSON asyncTask = new LoadCountryJSON(); // First 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) // Above Api Level 13 
     { 
      asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } 
     else // Below Api Level 13 
     { 
      asyncTask.execute(); 
     } 
     LoadStateJSON asyncTask2 = new LoadStateJSON(); // Second 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)// Above Api Level 13 
     { 
      asyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } 
     else // Below Api Level 13 
     { 
      asyncTask2.execute(); 
     } 
     LoadCityJSON asyncTask3 = new LoadCityJSON(); // Third 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)// Above Api Level 13 
     { 
      asyncTask3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } 
     else // Below Api Level 13 
     { 
      asyncTask3.execute(); 
     } 
    } 

Je suis passé par des liens suivants, mais il n'a pas aidé

http://blogs.innovationm.com/multiple-asynctask-in-android/

Two different AsyncTasks execute at the same time

Répondre

0

appels chaînées. Après avoir reçu la réponse d'un appel, vous appelez le suivant et ainsi de suite.

+0

Pouvez-vous s'il vous plaît fournir un exemple d'extrait ou toute référence – Pradeep

+0

Non , ce n'est pas clair ce que j'ai écrit? –

+0

J'ai compris laissez-moi essayer et vous mettre à jour.Thnx – Pradeep

1

Essayez quelque chose comme ceci:

// In AsyncTask1 
protected void onPostExecute(Result someResult) { 
    AsyncTask2 asyncTask2 = new AsyncTask2(someResult); 
    // execute asyncTask2 
} 
+0

Merci Algrid laissez-moi essayer cela et vous mettre à jour. – Pradeep

1

Vous pouvez rechercher une bibliothèque comme la promesse qui vous aidera à Enchainement si vous voulez ou vous pouvez votre propre chaîne. Toutefois, gardez à l'esprit que vous utilisez ExecuteOnExecutor. Par défaut, les AsyncTasks n'ont qu'un seul thread et ils attendent les uns les autres pour que la puissance de traitement du thread se déplace. Lorsque vous utilisez ExecuteOnExecutor et dites threadPool, vous indiquez de nouveaux threads pour chacun, ce qui les rend vraiment asynchrones. Toutefois, même si vous souhaitez que vos appels soient asynchrones, il semble que vous souhaitiez qu'ils soient synchronisés afin d'avoir deux options.

Vous pouvez simplement faire:

new MyAsync1stTask() { 
    protected void onPostExecute(Boolean result) { 
     new MyAsync2ndTask() { 
       protected void onPostExecute(Boolean result) { 
        //so on and so forth 
       } 
     }.execute(); // start the background processing 
    } 
}.execute(); // start the background processing 

ou

Vous pouvez faire une méthode et des drapeaux pour l'achèvement comme

private volatile boolean flag1; 
private volatile boolean flag2; 
private volatile boolean flag3; 

private void loadSpinners(){ 
    new MyAsync1stTask() { 
     protected void onPostExecute(Boolean result) { 
      flag1 = true; 
      moveOnIfReady(); 
     } 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

    new MyAsync2ndTask() { 
     protected void onPostExecute(Boolean result) { 
      flag2 = true; 
      moveOnIfReady(); 
     } 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

    new MyAsync3rdTask() { 
     protected void onPostExecute(Boolean result) { 
      flag3 = true; 
      moveOnIfReady(); 
     } 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 

private synchronized void moveOnIfReady(){ 
    if(flag1 && flag2 && flag3){ 
     releaseBusyIndicator() 
     doStuff(); 
    }//else do nothing, they aren't all done yet 
} 
+0

Merci Sam pour répondre laissez-moi l'essayer.Si cela fonctionne, je vais accepter ce – Pradeep

+0

Pas de problème, heureux d'aider. J'espère que cela fonctionne bien pour vous. – Sam

+0

Salut Sam J'ai accepté ceci comme réponse :) .Merci.Appréciez votre réponse rapide – Pradeep