6

У этого должен быть простой ответ, но я не смог его найти. И так как я все еще манекен андроида, я пришел сюда, чтобы спросить вас, люди.Есть ли предел AsyncTasks для выполнения одновременно?

Я делаю этот проект, который выполняет 10 AsyncTasks при запуске. Каждая задача содержит 3 URL-адреса, которые собирают данные и не делают ничего важного в приложении (пока).

У меня также есть 10 текстовых просмотров, которые я использую, чтобы отслеживать прогресс AsyncTasks.

Когда задача запускается соответствующая TextView ставится на «Start» Когда задача прогрессирует она устанавливает его соответствующее TextView «Загрузка» Когда задача закончена она устанавливает свою соответствующую TextView в «Закончено»

Это то, что я наблюдал, и поставил вопрос о AsyncTask. Когда я запускаю приложение, я замечаю, что 5 текстовых просмотров переключаются на маркер «Загрузка», поэтому я вижу, что 5 AsyncTasks выполняют свою работу так, как должны. Когда это будет сделано, он запустит новую AsyncTask. Тем не менее они никогда не достигают этого предела 5.

Что вызывает этот предел 5 AsynchTasks, запущенных одновременно? Я вызвал это в каком-то файле, который я не могу найти? Является ли это пределом Android 2.3.3? Может быть, лимит устройства, который я использую для приложения?

Может ли кто-нибудь разработать для меня?

+0

Этот вопрос решается здесь: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma Не совсем. Это определенно связано, но почему это не выходит за рамки 5, несколько отличается от того, почему он никогда не подпадает под 5. Он по-прежнему зависит от размера основного пула, но этот вопрос/ответ не учитывает, почему размер основного пула ограничил бы количество одновременных задач до 5, когда максимальный размер пула равен 128. – kabuko

+0

Я думаю, вы используете AsyncTask.execute() вместо AsyncTask.executeOnExecutor() –

ответ

8

Да, есть предел. AsyncTask поддерживается ThreadPoolExecutor с размером основного пула 5, но максимальный размер пула 128 (с 1,6 до 4,0,3), поэтому я бы подумал, что вы сразу увидите все 10 ваших. Однако вы не можете его изменить. Если вы действительно хотите сделать что-то другое (и я бы не рекомендовал его, если у вас нет особых причин), вам нужно будет сделать что-то обычай с большим размером пула или просто развернуть кучу потоков вручную.

Update:

Вот что говорят документы:

Если есть больше, чем corePoolSize, но меньше, чем maximumPoolSize нити работает, новый поток создается только если очередь заполнена.

Так вот почему. Ваша очередь не заполнена, поэтому она просто держит ее в размере основного пула.

+0

Вот ссылка на источник [AsyncTask] (http: // grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask) для справки. – kabuko

+2

Вы можете предоставить произвольный экземпляр Executor для 'executeOnExecutor()', если вы хотите настроить, как обрабатываются ваши 'AsyncTask'. – Argyle

+1

@ Аргил хорошая точка; это хороший вариант для API 11 и выше. – kabuko

0

ThreadPoolExecutor имеет corePoolSize, maxPoolSize и QueueCapacity. Если используются все ваши потоки из corePoolSize, любая другая задача помещается в очередь каждого из потоков из основного пула. После того как эти очереди заполнены, инициализируется новый поток, если он находится в пределах maxPoolSize.

Уловка заключается в том, что очереди каждой нити (если не изменено программно) равны UNBOUNDED. Это означает, что все ваши потоки из размера основного пула используются, а любые другие задачи поставлены в очередь и ждут своей очереди с одним из основных потоков. У них никогда не будет возможности достичь максимального размера пула.

Вам необходимо настроить собственный исполнитель и изменить емкость очереди. Удачи!

Смежные вопросы