2010-06-19 13 views
113

Ich verwende AsyncTask s, um Daten als Antwort auf den Benutzer per Tastendruck abrufen. Das funktioniert gut und hält die Schnittstelle beim Abrufen der Daten ansprechend, aber als ich ausgecheckt habe, was im Eclipse-Debugger vor sich ging, habe ich festgestellt, dass jedes Mal eine neue AsyncTask erstellt wurde (was sehr oft ist, weil sie nur verwendet werden kann) einmal) wurde ein neuer Thread erstellt, aber nie beendet. Das Ergebnis ist eine große Anzahl von AsyncTask Threads, die nur dort sitzen. Ich bin mir nicht sicher, ob das ein Problem in der Praxis ist oder nicht, aber ich möchte diese zusätzlichen Threads wirklich loswerden.AsyncTask-Threads nie sterben

Wie kann ich diese Threads töten?

+0

Was meinst du mit „nie beendet“? Beendet die Task ihre doInbackground-Methode nie oder sehen Sie nur das asynctask-Objekt im Zuordnungstraker? –

+7

Die doInBackground-Methode wird abgeschlossen, der Thread wird jedoch weiterhin im Debugfenster angezeigt. Zum Beispiel: 'Thread [<23> AsyncTask # 4] (ausgeführt)' – Computerish

Antwort

199

AsyncTask verwaltet einen Threadpool, erstellt mit ThreadPoolExecutor. Es wird von 5 bis 128 Threads haben. Wenn mehr als 5 Threads vorhanden sind, bleiben diese zusätzlichen Threads maximal 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).

Lassen Sie die AsyncTask Gewinde in Ruhe, bitte.

+0

uff! Gut das zu hören! hehe :) –

+0

Danke für die Erklärung! Ich bin froh zu wissen, dass ich nichts falsch mache. Aus Neugier, warum ist es so konzipiert? Warum nicht einfach die Threads beenden, nachdem alle Methoden zurückgegeben wurden? – Computerish

+7

Vermutlich um Zeit zu sparen, die Threads bei späteren Anforderungen abzweigen. – CommonsWare

23

Neben CommonsWare Antwort:

Derzeit bin ich mit Android 2.2, und meine Anwendung verwendet nicht mehr als eine AsyncTask zu jeder Zeit, aber ich bin ein neues alle x Minuten zu schaffen. Zuerst erscheinen neue AsyncTask-Threads (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 nur dort, bis der Debugger die Verbindung trennt.

+2

Ja, bestätigt: Ich sehe nicht mehr als 5 AsyncTasks. –

3

Gleiches Symptom hier. In meinem Fall haben die Threads herumgehangen, nachdem ich die Aktivität beendet hatte, und ich hatte gehofft, dass die App vollständig geschlossen wird. Problem teilweise durch Verwendung eines Single-Threaded-Exekutors gelöst:

myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor()); 

Dies machte den Faden nach der Beendigung seiner Arbeit zu verschwinden.

+0

Diese Antwort ließ die AsyncTask verschwinden, nachdem sie ausgeführt wurde, vielleicht ist es nicht der "Google-Weg, Dinge zu tun", aber es macht den Job erledigt. Vielen Dank. –

+0

Dies löste mein spezifisches Problem bezüglich der Ausführung von Asynctasks in einem einzigen Thread. –

0

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); 

Post Runnable Aufgabe durch execute() Methode.

void execute (Runnable command) 

Führt die gegebene Aufgabe in der Zukunft.

Wie kann ich diese Fäden töten: Die Aufgabe kann in einem neuen Thread oder in einem bestehenden gepoolten Gewinde

In Bezug auf Ihre zweite Abfrage ausführen?

Sobald Sie alle Ihre Arbeit mit ThreadPoolExecutor, shutdown getan werden es richtig, wie unten Post zitiert in:

How to properly shutdown java ExecutorService