6

Powinno to dać łatwą odpowiedź, ale nie mogłem znaleźć żadnej. A ponieważ wciąż jestem manekinem z Androidem, przyszedłem tutaj, aby zapytać was o ludzi.Czy istnieje limit zadań AsyncTasks do wykonania w tym samym czasie?

Robię projekt, który wykonuje 10 zadań AsyncTasks przy starcie. Każde zadanie zawiera 3 adresy URL, które zbierają tam dane i nie robią nic ważnego w aplikacji (jeszcze).

Mam również 10 tekstów, których używam do śledzenia postępów AsyncTasks.

Gdy zadanie uruchamia odpowiedni TextView kładzie się na „Start” Gdy zadanie postępuje ona wyznacza jej odpowiedni TextView „Pobieranie” Kiedy zadanie jest zakończone to ustawia odpowiednią TextView na „Zakończone”

To jest to, co zaobserwowałem i zadałem pytanie o AsyncTask. Po uruchomieniu aplikacji zauważyłem, że 5 z wyskakujących tekstów zmieniło się na znacznik "Pobieranie", więc widzę 5 zadań Asynchronicznych wykonujących swoją pracę tak, jak powinny. Po zakończeniu uruchamia nową AsyncTask. Jednak nigdy nie przekraczają tego limitu 5.

Co powoduje, że ten limit 5 AsynchTasks działa w tym samym czasie? Czy spowodowałem to w jakimś pliku, którego nie mogę znaleźć? Czy to jest limit Androida 2.3.3? Może limit urządzenia, którego używam do symulacji aplikacji?

Czy ktoś może dla mnie opracować?

+0

To pytanie jest skierowane tutaj: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma Niezupełnie. Jest to z pewnością powiązane, ale dlaczego liczba ta nie przekracza 5, różni się nieco od tego, dlaczego nigdy nie mieści się w kategorii 5. Pozostaje ona w związku z podstawowym rozmiarem puli, ale to pytanie/odpowiedź nie wyjaśnia, dlaczego ten podstawowy rozmiar puli byłby ograniczony liczba równoczesnych zadań do 5, gdy maksymalna wielkość puli to 128. – kabuko

+0

Myślę, że używasz AsyncTask.execute() zamiast AsyncTask.executeOnExecutor() –

Odpowiedz

8

Tak, istnieje limit. AsyncTask jest wspierany przez ThreadPoolExecutor z podstawową wielkością puli równą 5, ale maksymalną wielkością puli 128 (od 1.6 do 4.0.3), więc naprawdę uważam, że powinieneś zobaczyć wszystkie twoje 10 uruchomionych jednocześnie. Nie możesz tego zmienić. Jeśli naprawdę chcesz zrobić coś innego (i nie polecałbym tego, chyba że masz konkretny powód), musisz zrobić coś niestandardowego z większym rozmiarem puli lub ręcznie zakręcić kilka wątków.

Aktualizacja:

Oto co docs powiedzieć:

Jeśli istnieje więcej niż corePoolSize ale mniej niż maximumPoolSize wątków uruchomiony nowy wątek zostanie utworzona tylko wtedy, gdy kolejka jest pełna.

Oto dlaczego. Twoja kolejka nie jest pełna, więc po prostu utrzymuje ją w podstawowym rozmiarze puli.

+0

Oto link do źródła [AsyncTask] (http: // grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask) w celach informacyjnych. – kabuko

+2

Możesz dostarczyć dowolną instancję 'Executor' do' executeOnExecutor() 'jeśli chcesz dostosować sposób obsługi' AsyncTask's. – Argyle

+1

@Argyle dobra uwaga; to dobra opcja dla API 11 i nowszych. – kabuko

0

ThreadPoolExecutor ma corePoolSize, maxPoolSize i QueueCapacity. Jeśli wszystkie wątki z corePoolSize są używane, każde inne zadanie jest umieszczane w kolejce każdego wątku z puli core. Po zapełnieniu tych kolejek inicjowany jest nowy wątek, o ile mieści się w granicach maxPoolSize.

Połów tutaj, że kolejki każdego wątku (chyba że zmienione programowo) są UNBOUNDED. Oznacza to, że używane są wszystkie wątki z podstawowego rozmiaru puli, a wszystkie inne zadania czekają w kolejce z jednym z głównych wątków. Nigdy nie mają szansy na osiągnięcie maksymalnego rozmiaru puli.

Musisz skonfigurować swój własny Executor i zmienić pojemność kolejki. Powodzenia!