android — Потоки AsyncTask никогда не умирают" />

Потоки AsyncTask никогда не умирают

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

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

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

112 голосов | спросил Computerish 20 J0000006Europe/Moscow 2010, 02:21:35

4 ответа


0

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

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

ответил CommonsWare 20 J0000006Europe/Moscow 2010, 02:37:57
0

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

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

ответил Tom de Waard 14 TueEurope/Moscow2010-12-14T20:24:56+03:00Europe/Moscow12bEurope/MoscowTue, 14 Dec 2010 20:24:56 +0300 2010, 20:24:56
0

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

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

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

ответил karnbo 25 Jpm1000000pmSat, 25 Jan 2014 20:27:07 +040014 2014, 20:27:07
0

Используйте 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

ответил Ravindra babu 6 +03002017-10-06T20:28:27+03:00312017bEurope/MoscowFri, 06 Oct 2017 20:28:27 +0300 2017, 20:28:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132