Ich verwende AsyncTask
s, um Daten abzurufen, wenn der Benutzer eine Taste drückt. Dies funktioniert gut und sorgt dafür, dass die Benutzeroberfläche beim Abrufen der Daten reagiert. Als ich jedoch überprüfte, was im Eclipse-Debugger vor sich ging, stellte ich fest, dass jedes Mal ein neues AsyncTask
erstellt wurde (was häufig der Fall ist, da sie nur einmal verwendet werden können ) wurde ein neuer Thread erstellt, aber nie beendet.
Das Ergebnis ist eine große Anzahl von AsyncTask
Threads, die gerade dort sitzen. Ich bin mir nicht sicher, ob dies in der Praxis ein Problem ist oder nicht, aber ich würde diese zusätzlichen Threads wirklich gerne loswerden.
Wie kann ich diese Threads beenden?
android
multithreading
android-asynctask
Computerisch
quelle
quelle
doInBackground
Methode ist abgeschlossen, aber der Thread wird weiterhin im Debug-Fenster angezeigt. Zum Beispiel:Thread [<23> AsyncTask #4](Running)
Antworten:
AsyncTask
verwaltet einen Thread-Pool, der mit erstellt wurdeThreadPoolExecutor
. Es wird 5 bis 128 Threads haben. Wenn mehr als 5 Fäden vorhanden sind, bleiben diese zusätzlichen Fäden höchstens 10 Sekunden lang bestehen, bevor sie entfernt werden. (Hinweis: Diese Zahlen gelten für den derzeit sichtbaren Open Source-Code und variieren je nach Android-Version.)Lass die
AsyncTask
Fäden bitte in Ruhe.quelle
AsyncTask
für etwas, das so lange dauern würde, ist im Allgemeinen eine schlechte Idee. Aber nein, mein Kommentar zu den zusätzlichen Threads, die weggehen, ist, wenn sie nicht verwendet werden. Wenn eine Ihrer 6 Aufgaben beendet ist, bleibt der Thread 10 Sekunden lang im Pool. Danach wird dieser Thread beendet.AsyncTask
heutige Nutzung sinnvoll zu nutzen, ist kein guter Plan. 20+, die länger als 10 Sekunden laufen können, sollten eine Codeüberprüfung nicht bestehen. Wenn Sie 20 Aufgaben schnell hintereinander erstellen, werden nur wenige gleichzeitig ausgeführt, und der Rest wird für die spätere Ausführung in die Warteschlange gestellt. Wie viele gleichzeitig ausgeführt werden, hängt von der Anzahl der Kerne der CPU ab. AFAIK, der aktuelle Algorithmus ist 2N + 1 parallele Threads, wobei N die Anzahl der Kerne ist.Zusätzlich zur Antwort von CommonsWare:
Derzeit verwende ich Android 2.2 und meine Anwendung verwendet zu keinem Zeitpunkt mehr als eine AsyncTask, aber ich erstelle alle x Minuten eine neue. Zuerst werden neue AsyncTask-Threads angezeigt (ein neuer Thread für eine neue AsyncTask), aber nach 5 Threads (wie von CommonsWare erwähnt) bleiben sie nur im Debug-Fenster sichtbar und werden wiederverwendet, wenn neue AsyncTask-Threads benötigt werden. Sie bleiben einfach dort, bis der Debugger die Verbindung trennt.
quelle
Gleiches Symptom hier. In meinem Fall hingen die Threads herum, nachdem ich die Aktivität beendet hatte, und ich hoffte, dass die App vollständig geschlossen wurde. Problem teilweise gelöst mit einem einzelnen Thread-Executor:
Dies ließ den Faden nach Abschluss seiner Arbeit verschwinden.
quelle
Verwenden Sie ThreadPoolExecutor .
Veröffentlichen Sie Ihre
Runnable
Aufgabe mit der Methode execute () .Zu Ihrer zweiten Anfrage:
Wenn Sie mit all Ihrer Arbeit fertig sind, fahren Sie
ThreadPoolExecutor
sie ordnungsgemäß herunter, wie im folgenden Beitrag angegeben:So beenden Sie Java ExecutorService ordnungsgemäß
quelle