wake-up-neo.com

AsyncTask-Threads sterben nie

Ich verwende AsyncTasks zum Abrufen von Daten, 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 herausfand, was im Eclipse-Debugger vor sich ging, stellte ich fest, dass jedes Mal eine neue AsyncTask erstellt wurde (was häufig der Fall ist, da sie nur verwendet werden können) einmal) wurde ein neuer Thread erstellt, aber niemals beendet. 

Das Ergebnis ist eine große Anzahl von AsyncTask-Threads, die nur dort sitzen. Ich bin mir nicht sicher, ob dies ein Problem in der Praxis ist oder nicht, aber ich möchte diese zusätzlichen Threads wirklich gerne loswerden. 

Wie kann ich diese Threads beenden?

112
Computerish

AsyncTask verwaltet einen mit ThreadPoolExecutor erstellten Thread-Pool. Es wird 5 bis 128 Threads haben. Wenn mehr als 5 Threads vorhanden sind, bleiben diese zusätzlichen Threads höchstens 10 Sekunden lang in der Nähe, bevor sie entfernt werden. (Hinweis: Diese Zahlen beziehen sich auf den derzeit sichtbaren Open-Source-Code und variieren je nach Android-Version).

Lassen Sie die AsyncTask-Threads bitte in Ruhe.

200
CommonsWare

Zusätzlich zur Antwort von CommonsWare:

Momentan verwende ich Android 2.2 und meine Anwendung verwendet zu jeder Zeit nicht mehr als eine AsyncTask. Ich erstelle jedoch alle x Minuten eine neue. Zunächst erscheinen neue AsyncTask-Threads (ein neuer Thread für eine neue AsyncTask), aber nach 5 Threads (wie von CommonsWare erwähnt) bleiben sie einfach im Debug-Fenster sichtbar und werden erneut verwendet, wenn neue AsyncTask-Threads benötigt werden. Sie bleiben einfach dort, bis der Debugger die Verbindung trennt.

23
Tom de Waard

Gleiches Symptom hier. In meinem Fall hingen die Fäden herum, nachdem ich die Aktivität beendet hatte, und ich hoffte, dass die App vollständig geschlossen wird. Problem teilweise gelöst, indem ein einzelner Thread-Executor verwendet wurde:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

Dadurch verschwand der Faden nach Beendigung seiner Arbeit.

3
karnbo

Verwenden Sie ThreadPoolExecutor .

BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(),       // Initial pool size
            Runtime.getRuntime().availableProcessors(),       // Max pool size
            1, // KEEP_ALIVE_TIME
            TimeUnit.SECONDS, //  KEEP_ALIVE_TIME_UNIT
            workQueue);

Veröffentlichen Sie Ihre Runnable-Task mithilfe der execute () -Methode.

void execute (Runnable command)

Führt die gegebene Aufgabe irgendwann in der Zukunft aus. Die Task kann in einem neuen Thread oder in einem vorhandenen Pool-Thread ausgeführt werden

Zu Ihrer zweiten Abfrage:

Wie kann ich diese Threads beenden?

Wenn Sie mit ThreadPoolExecutor fertig sind, fahren Sie sie ordnungsgemäß herunter, wie im folgenden Beitrag angegeben:

So beenden Sie Java ExecutorService ordnungsgemäß

0
Ravindra babu