Есть ли предел одновременных задач AsyncTasks? - PullRequest
7 голосов
/ 07 марта 2012

Это должен быть простой ответ, но я не смог найти ни одного. И так как я все еще кукла-андроид, я пришел сюда, чтобы спросить вас, люди.

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

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

Когда задание запускается, соответствующий текстовый вид помещается в «Пуск» Когда задача выполняется, она устанавливает соответствующий текстовый вид на «Загрузка» Когда задача завершена, она устанавливает соответствующий текстовый вид «Завершено»

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

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

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

Ответы [ 2 ]

8 голосов
/ 07 марта 2012

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

Обновление:

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

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

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

0 голосов
/ 17 марта 2016

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

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

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

...