0

Ich habe einen Hintergrund-Thread, der 3 asynctasks aufruft, um Aufgaben gleichzeitig auszuführen. Der aufrufende Thread fungiert als Warteschlange für drei Sätze dieser Aufgaben.Halten Sie den Aufruf Thread, bis mehrere asynctask beendet

Also im Grunde muss ich 3 asynctasks gleichzeitig aufrufen und sobald sie abgeschlossen sind, möchte ich die nächsten drei Aufgaben in der Warteschlange aufrufen und wiederholen.

Ich habe jedoch Probleme beim Anhalten der Anrufer-Thread, bis die drei asynctask beendet ist. Als Ergebnis werden die nächsten drei Aufgaben in der Warteschlange ausgeführt, bevor die vorherigen drei Aufgaben abgeschlossen sind.

So gibt es sowieso den Anrufer Thread zu halten, bis die Asyntasks abgeschlossen sind. Ich weiß, dass Sie .get() in asynctask verwenden können, aber die drei asynctasks können nicht gleichzeitig ausgeführt werden.

+0

Vielleicht mit übergeben Sie einen Zuhörer auf Ihre 3 asyntask und rufen Methode Ihrer Zuhörer in der OnPostExecute Ihres 3 AsyncTask, wenn die 3 AsyncTask diese Methode aufrufen musste getan werden könnte, können Sie Ihre 3 weiter AsyncTask starten. Und ich denke, dass Sie einen Service und kein Gewinde für das Starten Ihrer asynctask verwenden sollten. Hoffe, dass Hilfe. – Illuyankas

+0

Ich benutze den Looper, um Aufgaben in die Warteschlange zu stellen und damit konnte ich keine Möglichkeit finden, die nächste Aufgabe anzuhalten. –

+0

Wenn ich mich gut erinnere, ist Looper nicht für Pause gemacht. Wenn ich etwas tun musste, passiere ich den Dienst, der eine Liste deiner Aufgabe bekommt (die dynamisch gesetzt werden kann) und 3 Aufgaben gleichzeitig starten, wenn sie fertig sind, starte das Kommando erneut, während du eine Aufgabe in der Warteschlange oder etwas ähnliches hast . – Illuyankas

Antwort

0

Async Aufgaben sollen Dinge asynchron tun .... so kann dies nicht in einer geraden Weg nach vorn getan werden ...

Auch wenn es Ihnen gelingt, dies zu tun, es besiegt im Grunde der ganze Sinn der asynchroner Betrieb

Sie sollten nach einer synchronen Netzwerkoperation suchen.

Check out Volley ... Es ist eine Google-Bibliothek ist speziell für Netzwerk-Operationen gemacht und unterstützt synchrone Operationen

http://www.truiton.com/2015/02/android-volley-making-synchronous-request/

Es gibt viele andere Bibliotheken zur Verfügung ... Retrofit ist ein andere gute Bibliothek ..

+0

Ich mache keine Netzwerkoperation in der Aufgabe. –

+0

Ich brauche auch asynchrone Funktionen, aber nur drei gleichzeitig –

1

Folgende Code ist eher ein Pseudocode der Idee. Im Grunde deklarieren Sie eine Schnittstelle, die prüft, ob die nächsten drei AsyncTasks abgefeuert werden. Sie müssen auch einen Zähler verwalten, um zu sehen, ob die Anzahl der empfangenen Antworten von AsyncTask mit 3 multipliziert wird. Wenn dies der Fall ist, können Sie die nächsten drei AsyncTasks auslösen.

public interface OnRunNextThree{ 
    void runNextThreeTasks(); 
} 

public class MainClass extends Activity implements OnRunNextThree { 

    private int asyncTasksCounter = 0; 

    public void onCreate() { 
     //Initiate and run first three of your DownloadFilesTask AsyncTasks 

     // ... 
    } 

    public void runNextThreeTasks() { 
     if (asyncTasksCounter % 3 == 0) { 
      // you can execute next three of your DownloadFilesTask AsyncTasks now 

      // ... 
     } else { 
      // Otherwise, since we have got response from one of our previously 
      // initiated AsyncTasks so let's update the counter value by one. 
      asyncTasksCounter++; 
     } 
    } 

    private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { 

     private OnRunNextThree onRunNextThree; 

     public DownloadFilesTask(OnRunNextThree onRunNextThree) { 
      this.onRunNextThree = onRunNextThree; 
     } 


     protected Void doInBackground(Void... voids) { 
      // Do whatever you need to do in background 
      return null; 
     } 

     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      //Got the result. Great! Now trigger the interface. 
      this.onRunNextThree.runNextThreeTasks(); 
     } 
    } 

} 
+0

@Sankha Palihawadana Wenn es Ihre Anforderung erfüllt, markieren Sie bitte die Antwort als akzeptiert. – fluffyBatman

Verwandte Themen