ASyncTask не выполняется при вызове task.execute () - PullRequest
2 голосов
/ 10 августа 2011

У меня есть приложение для Android, которое имеет основной поток пользовательского интерфейса, и несколько других рабочих потоков, которые я создал с помощью ASyncTask.

Однако есть сценарий, который я могу создавать каждый раз, когда я пытаюсь создать новый поток с ASyncTask, используя task.execute (), и он не вызывает doInBackground ().Кажется, что нить никогда не начинается.Затем мое приложение некоторое время вращается, а затем начинает зависать.

Вот потоки, которые я использую: enter image description here

А вот использование памяти на устройстве:

enter image description here

Не похоже, что он не может появиться из-за проблем с памятью.

Есть ли какая-то другая причина, о которой я не знаю?Максимальное количество потоков?Могу ли я узнать, почему он не выполняется?

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

AsyncTask использует ThreadPoolExecutor для внутреннего использования с размером пула ядер 5 и LinkedBlockingQueue .Проще говоря: одновременно вы можете активировать не более 5 AsyncTasks.Дополнительные задачи будут поставлены в очередь до тех пор, пока одна из других AsyncTasks не вернется из doInBackground ().

Вы можете просмотреть свой код, чтобы освободить некоторые AsyncTasks.Если это невозможно, вы можете попытаться создать класс CustomAsyncTask в своем проекте на основе исходного кода AsyncTask, который можно найти здесь .Попробуйте установить для переменной CORE_POOL_SIZE более высокое значение или использовать SynchronousQueue .

1 голос
/ 10 августа 2011

Читали ли вы документы?

Примечание: эта функция планирует задачу в очереди для одного фонового потока или пула потоков в зависимости от версии платформы.При первом представлении AsyncTasks выполнялись последовательно в одном фоновом потоке.Начиная с DONUT, это было изменено на пул потоков , позволяющий нескольким задачам работать параллельно.После HONEYCOMB планируется изменить это обратно на один поток , чтобы избежать распространенных ошибок приложения, вызванных параллельным выполнением.Если вы действительно хотите параллельное выполнение, вы можете использовать версию метода метода executeOnExecutor (Executor, Params ...) с THREAD_POOL_EXECUTOR;однако см. там комментарии для предупреждений по его использованию.

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...