2016-09-18 7 views
-3

In der OnCreate-Methode habe ich 3 AsyncTask aufgerufen, die im Grunde Daten für die 3 Spinner füllt. Was ich brauche, ist, dass ich die Login-Schaltfläche deaktivieren sollte, bis alle 3 Aufgaben abgeschlossen sind. Wie kann ich das erreichen?warten auf AsyncTask zu beenden

  new SpinnerDataFetcher("GetFreeDrivers1",(Spinner)findViewById(R.id.Spinner_1)).execute(); 

      new SpinnerDataFetcher("GetFreeDrivers2",(Spinner)findViewById(R.id.Spinner_2)).execute(); 

      new SpinnerDataFetcher("GetFreeDrivers3",(Spinner)findViewById(R.id.Spinner_3)).execute(); 
+0

Sie sollten nicht so AsyncTask verwenden, wenn Sie versuchen, einige Daten zu laden versuchen Sie stattdessen AsyncTaskLoader. – Lazai

Antwort

0

erhöhen Sie einfach eine Zahl, die auf entspricht, wie viele AsyncTask sind fertig.

 int s = 0; 

     @Override 
     public void onCreate(@Nullable Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

     } 

     public void check(){ 
      if(s >=3){ 
      s= 0; 
      // enable button here 
      } 
     } 
0

Dafür Sie Button deaktivieren müssen, bevor gesetzt Button-EnableSecond von Spinner1DateFetcher Methode onPostExecute und gleiche wie Third Spinner Verfahren und in Third SpinneronPostExecutenew Spinner1DateFetcher und rufen Aufruf ..

Für Schaltfläche Deaktivieren Verwendung

Button.setEnabled(false); 

und Für Verwendung

Button.setEnabled(true); 

bearbeiten aktivieren Button:

für den Parameter überprüfen Sie Constuctor hinzufügen müssen, und überprüfen Sie den Zustand wie unten Art und Weise.

+1

Ihre Lösung ist großartig, aber die Sache ist, dass jeder der AsyncTasks unterschiedliche Parameter hat. Bitte sehen Sie meine bearbeitete Frage. –

+0

@AkshayJ siehe meine Update-Antwort. – Ironman

+0

Ihre Antwort schlägt einen rekursiven Aufruf der Funktion execute() vor. Aber das Argument ist für die 3 Anrufe unterschiedlich. Wie werde ich damit umgehen? –

0

Initialisieren Sie Ihre AsyncTask-Instanz mit einem Verweis auf die Aktivität/das Fragment, das sie erstellt. Dann signalisiere wieder in onPostExecute, wenn es fertig ist

z.B.

class Spinner1DataFetcher extends AsyncTask<...> { 
     public Spinner1DataFetch(YourActivityOrFragment activity) { 
      _activity = activity; 
     } 

     protected void onPostExecute(...) { 
      _activity.spinner_1_is_done(); 
     } 
} 
0

Es gibt mehrere Möglichkeiten, wie Sie dies erreichen können.

Die einfache Möglichkeit, dies zu implementieren, ist ein Zähler zu erstellen, der die UI-Aktualisierung auslöst.

final InterfaceTrigger trigger = new InterfaceTrigger(); 

new AsyncTask<>() { 
    @Override 
    protected void onPostExecute(Object o) { 
     super.onPostExecute(o); 
     trigger.finishJob(); 
     if (trigger.isTimeToUpdateUi()) { 
      // TODO update your UI 
     } 
    } 
    }; 

public class InterfaceTrigger { 
    private static final int THRESHOLD = 3; 
    private int counter; 

    public synchronized void finishJob() { 
     counter++; 
    } 

    public synchronized boolean isTimeToUpdateUi() { 
     return counter == THRESHOLD; 
    } 
} 

Ein anderer Weg ist CyclicBarier und ExcutorService Mechanismus zu verwenden.

Verwandte Themen