Потоки AsyncTask никогда не умирают - PullRequest
112 голосов
/ 20 июня 2010

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

В результате большое количество потоков AsyncTask просто сидит там.Я не уверен, является ли это проблемой на практике или нет, но я бы очень хотел избавиться от этих лишних тем.

Как мне убить эти темы?

Ответы [ 4 ]

200 голосов
/ 20 июня 2010

AsyncTask управляет пулом потоков, созданным с помощью ThreadPoolExecutor. Он будет иметь от 5 до 128 потоков. Если существует более 5 потоков, эти дополнительные потоки будут задерживаться не более 10 секунд перед удалением. (примечание: эти цифры относятся к общедоступному открытому исходному коду и различаются в зависимости от выпуска Android).

Оставьте AsyncTask темы в покое, пожалуйста.

24 голосов
/ 14 декабря 2010

В дополнение к ответу CommonsWare:

В настоящее время я использую Android 2.2, и мое приложение использует не более одного AsyncTask одновременно, но я создаю новый каждые x минут.Сначала начинают появляться новые потоки AsyncTask (новый поток для нового AsyncTask), но после 5 потоков (как упомянуто CommonsWare) они просто остаются видимыми в окне отладки и снова используются, когда нужны новые потоки AsyncTask.Они просто остаются там, пока отладчик не отключится.

3 голосов
/ 25 января 2014

Тот же симптом здесь.В моем случае потоки зависали после того, как я убил активность, и я надеялся, что приложение полностью закроется.Проблема частично решена с помощью однопоточного исполнителя:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

Это заставило поток исчезнуть после завершения его работы.

0 голосов
/ 06 октября 2017

Использование ThreadPoolExecutor .

BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(),       // Initial pool size
            Runtime.getRuntime().availableProcessors(),       // Max pool size
            1, // KEEP_ALIVE_TIME
            TimeUnit.SECONDS, //  KEEP_ALIVE_TIME_UNIT
            workQueue);

Разместите вашу задачу Runnable с помощью метода execute () .

void execute (Runnable command)

Выполняет задание когда-нибудь в будущем. Задача может выполняться в новом потоке или в существующем потоке пула

Относительно вашего второго запроса:

Как я могу убить эти темы?

Как только вы закончите со всей своей работой с ThreadPoolExecutor, выключите ее должным образом, как указано в посте ниже:

Как правильно отключить Java ExecutorService

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