0

Ich habe 30 Threads (AsyncTask) in der gleichen Zeit ausgeführt. Bevor sie ausgeführt werden, zeige ich progressdialog an. Nachdem die Threads die Ausführung beendet haben, werde ich den Fortschrittdialog ablehnen.Wie ProgressDialog nach Beendigung aller Threads zu entlassen?

Irgendwelche Vorschläge auf Wie ProgressDialog nach Abschluss aller Threads zu entlassen?

Antwort

1

Wenn Sie genau 30 Threads verwenden, dann initialisieren Sie eine Variable mit 30 und verringern Sie nach jeder abgeschlossenen Task die Anzahl um eins und prüfen Sie, ob die Variable Null ist. Wenn es Null ist, zeigt dies an, dass alle Aufgaben abgeschlossen wurden. So können Sie den ProgressDialog ablehnen.

+0

man wird ein for-Schleife ausgeführt werden müssen, um kontinuierlich den Zähler zu prüfen, die den UI-Thread blockiert und wird nicht empfohlen. – Akhil

+1

Nein, schreibe es einfach in onPostexecute() deiner asynchronen Aufgabe. also wird es nur 30 mal prüfen. das heißt, einmal für jede asynchrone Aufgabe – Ishu

+0

auch ich denke, die Variable sollte zwischen allen Threads geteilt werden? – thalsharif

1

Der beste Weg, dies zu tun ist mit einem AsyncTask(), um Ihre Arbeit auszuführen und den Dialog in onPOstExecute() davon zu schließen. Dadurch wird sichergestellt, dass die Aufgabe abgeschlossen und der ProgressDialog beendet wurde. Wenn Sie weiterhin Threads verwenden möchten, müssen Sie einen benutzerdefinierten Listener implementieren, der ausgelöst wird, sobald ein Thread abgeschlossen wurde, und Sie können einen Zähler darüber einrichten, wie oft er ausgelöst wurde. Ich haben Sie einen Code könnte, ist besser Beispiel unter diesem Link: How to know if other threads have finished?

1

können Sie eine globale Klasse verwenden:

public abstract class Global{ 

private static int counter = 30; 
private static ProgressDialog pd; 
private static Activity a; 

public static synchronized void updateCounter(){ 


counter--; 

if(counter<=0){ 

    a.runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 

     pd.dismiss(); 
    } 
    }); 

    } 

} 

} 

Sie benötigen die „synchronisiert“ wegen des gleichzeitigen Zugriff der Threads zu verwenden, .

Und in Ihrer Haupttätigkeit beginnen die ProgressDialog und die Variablen initialisieren:

Global.a = this; 
Global.pd = ProgressDialog.show(this, "Tittle","Message ...", true); 

und dann die Fäden beginnen.

Am Ende eines jeden Fadens kann man dann rufen Global.updateCounter();

+0

gute Lösung. Vielen Dank. – thalsharif

Verwandte Themen