Prüfen Sie, ob alle AsyncTasks abgeschlossen haben
Ich habe 3 AsyncTasks
und 1 ProgressBar
. Ich möchte, wenn eine Aufgabe ausgeführt wird, wird der Fortschrittsbalken sichtbar ist, und wenn alle fertig sind, wird die Statusleiste nicht sichtbar ist.
In Java gibt es ExecutorService::isTerminated
zu überprüfen, ob alle runnables fertig, aber Android hat es nicht.
Update: 3 Aufgaben gleichzeitig ausgeführt werden.
Abbildung.
- Versuchen Sie die Lösung, die ich unten angegeben, es funktioniert wie ein Charme
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schöne Grafik. Aber ich fürchte, es ist kein build-in-Mechanismus für diese. Sie werden umsetzen müssen Sie es selbst. Es gibt einige Lösungen, die man verwenden könnte -
Versuchen Sie es mit AsyncTask.getStatus(). Dieser funktioniert einwandfrei in Ordnung. Finden Sie unter Beispiel-code.
Können Sie später den loop der AsyncTaskList und finden Sie jeweils die Aufgaben " status als unten.
Ein einfacher workaround wäre die Nutzung von drei boolean-Variablen, die einer für jeden AsyncTask und dann überprüfen Sie Sie entsprechend.
Ein besserer Ansatz wäre die Erstellung einer separaten Klasse, die Sie erweitert AsynTask und definiert eine callback-interface, das ausgelöst wird, in onPostExecute.
erstellen Sie ein Feld zum halten aller Aufgaben:
Ihre Aufgaben starten auf diese Weise:
auf die onPostExecute von MyAsyncTask:
Gut wie Sie wissen, wenn ein
AsyncTask
endet (wennonPostExecute
aufgerufen wird):eine Lösung könnte sein, um eine Methode zu erstellen
setProgressBarVisible()
hält einen Zähler, und bei der ersten genannten Sätze sichtbar ist, und eine MethodesetProgressBarInvisible()
, sinkt der Zähler und null setzt, wenn der Fortschrittsbalken unsichtbar.😕 ich denke, es ist nur ein trick. Sie wird wieder einige Nachricht an
onPostExecute
jederAsyntask
und vergleichen. (diese Nachricht enthalten kann, eine Zeit, zum Beispiel)Einen offiziellen support der CompletableFuture eingeführt wurde, da API-Ebene 24.
Es ist auch verfügbar in Java 8 hier.
Verwenden können, verwenden Sie einfach so etwas wie:
Ich würde einfach melden es an
onPostExecute()
finden onPostExecute-und 4 Schritte im Dokument zum detail und Sie könnenEventBus
zu tun, einige abonnieren Dinge.Dies ist eine häufige Frage, wenn Sie möchten, führen Sie eine Reihe von AsynTasks auf eine THREAD_POOL_EXECUTOR. Es ist viel schneller, als wenn du einfach nur anrufen
.execute()
und alle Ihre Aufgaben fertig sind, eins nach dem anderen.Also, wenn Sie haben mehrere jobs und Objekte sind nicht voneinander abhängig, Staaten - versuchen, für die Ausführung auf einem thread-pool.
Aber die Frage ist: Woher weiß ich, dass alle meine Aufgaben erledigt?
Gibt es keinen eingebauten Methoden in AsyncTask so sollte man ein wenig Abhilfe.
In meinem Fall ich habe eine statische Hashmap Feld, um meine Asynctask-Klasse den überblick zu behalten, begann und beendete Aufgaben. Als bonus eine Karte kann ich immer wissen, welche Aufgabe gerade ausgeführt wird.
- und ad drei einfache Methoden zum Zugriff auf diese Karte.
Wichtig: Sie synchronisiert werden sollen
Möchten Sie ein neues Element hinzufügen, um die tracking-Karte in einem AsyncTask Konstruktor und entfernen Sie es in onPostExecute():
Jedesmal, wenn ein task beendet ist, ruft es onPostEexecute und Sie überprüfen, ob es war die Letzte Aufgabe. Wenn es keine Aufgaben gibt, Links zu setzen - senden ein signal, dass Sie fertig sind.
Nun, hier habe ich EventBus zu Veranstaltungen senden, um mein Fragment, aber Sie können einen Rückruf. In diesem Fall sollten Sie eine Benutzeroberfläche erstellen, mit callbackMethod, Ihr Fragment (jede der UI-Komponenten, die warten auf das Ereignis), sollte dieses interface implementieren und die Methode. Dann in AsyncTask-Konstruktor bekommen Sie Ihre Fragment, der als argument einen Verweis darauf beibehalten, so können Sie rufen Sie die callback-Methode, wenn alles erledigt ist.
Aber ich mag nicht solchen Ansatz. Zuerst müssen Sie halten Sie die Referenz Ihres Fragment (oder jede andere UI) in eine WeakReference-wrapper, weil Sie zu einem Speicherverlust, wenn Ihr fragment tot ist (aber noch im Speicher gehalten, weil Ihre AsyncTask hat es die Referenz).
Auch würden Sie brauchen, um eine Menge an Kontrollen, und es wird so Aussehen, dass:
yep, in der Produktion sollte man ein wenig paranoic und tun alle diese Prüfungen 🙂
Das ist, warum Sie verwenden können, EventBus und wenn die Benutzeroberfläche ist tot - was auch immer.
versuchen, diese, vielleicht können die dir helfen...