Używam AsyncTask
s do pobierania danych w odpowiedzi na naciśnięcie przycisku przez użytkownika. Działa to dobrze i utrzymuje responsywność interfejsu podczas pobierania danych, ale kiedy sprawdzałem, co się dzieje w debugerze Eclipse, stwierdzałem, że za każdym razem, gdy AsyncTask
tworzony był nowy (co jest dość często, ponieważ można ich użyć tylko raz ), nowy wątek był tworzony, ale nigdy nie został zakończony.
W rezultacie AsyncTask
po prostu siedzi tam duża liczba wątków. Nie jestem pewien, czy jest to problem w praktyce, czy nie, ale naprawdę chciałbym pozbyć się tych dodatkowych wątków.
Jak mogę zabić te wątki?
android
multithreading
android-asynctask
Komputerowe
źródło
źródło
doInBackground
Metoda kończy, ale wątek nadal pojawiają się w oknie debugowania. Na przykład:Thread [<23> AsyncTask #4](Running)
Odpowiedzi:
AsyncTask
zarządza pulą wątków utworzoną za pomocąThreadPoolExecutor
. Będzie miał od 5 do 128 wątków. Jeśli jest więcej niż 5 wątków, te dodatkowe wątki będą trzymać się maksymalnie przez 10 sekund, zanim zostaną usunięte. (Uwaga: te liczby dotyczą obecnie widocznego kodu open source i różnią się w zależności od wersji Androida).Zostaw
AsyncTask
wątki w spokoju.źródło
AsyncTask
do czegoś, co zajęłoby tak długo, jest ogólnie złym pomysłem. Ale nie, mój komentarz dotyczący dodatkowych wątków odchodzących jest wtedy, gdy są nieużywane. Zatem po zakończeniu jednego z 6 zadań jego wątek pozostanie w puli przez 10 sekund, po czym ten wątek zostanie zakończony.AsyncTask
dzisiejszego dnia nie jest wielkim planem. Posiadanie 20+, które mogą działać przez ponad 10 sekund, to coś, co powinno zakończyć się niepowodzeniem podczas przeglądu kodu. Jeśli utworzysz 20 zadań w krótkim odstępie czasu, tylko kilka zostanie uruchomionych naraz, a reszta zostanie umieszczona w kolejce do późniejszego wykonania. To, ile będzie działać na raz, zależy od liczby rdzeni procesora. AFAIK, obecny algorytm to 2N + 1 równoległych wątków, gdzie N to liczba rdzeni.Oprócz odpowiedzi CommonsWare:
Obecnie używam Androida 2.2, a moja aplikacja używa nie więcej niż jednego AsyncTask w dowolnym momencie, ale tworzę nowe co x minut. Na początku pojawiają się nowe wątki AsyncTask (nowy wątek dla nowego AsyncTask), ale po 5 wątkach (jak wspomniał CommonsWare) pozostają one widoczne w oknie debugowania i są ponownie używane, gdy potrzebne są nowe wątki AsyncTask. Po prostu pozostają tam, dopóki debugger się nie rozłączy.
źródło
Ten sam symptom tutaj. W moim przypadku wątki zawisły po tym, jak zabiłem działanie i miałem nadzieję, że aplikacja zostanie całkowicie zamknięta. Problem częściowo rozwiązany za pomocą jednowątkowego executora:
To sprawiło, że nić zniknęła po zakończeniu pracy.
źródło
Użyj ThreadPoolExecutor .
Opublikuj swoje
Runnable
zadanie za pomocą metody execute () .Odnośnie drugiego zapytania:
Gdy skończysz z całą swoją pracą
ThreadPoolExecutor
, zamknij ją prawidłowo, jak podano w poniższym poście:Jak prawidłowo zamknąć java ExecutorService
źródło