Нити асинктюз никогда не умирают
-
28-09-2019 - |
Вопрос
я использую AsyncTask
s для получения данных в ответ на пользователь нажав кнопку. Это хорошо работает и держит интерфейс отзывчив, привлекая данные, но когда я проверил, что происходит в отладчике Eclipse, я обнаружил, что каждый раз новый AsyncTask
Было создано (что нередко, потому что их можно использовать только один раз), создается новая тема, но никогда не прекращается.
Результат - большое количество AsyncTask
Нити просто сидят там. Я не уверен, что это проблема на практике или нет, но я бы очень хотел избавиться от этих дополнительных потоков.
Как я могу убить эти темы?
Решение
AsyncTask
управляет пулом нитей, созданного с ThreadPoolExecutor
. Отказ Он будет от 5 до 128 потоков. Если существует более 5 потоков, эти дополнительные потоки будут придерживаться в течение более 10 секунд, прежде чем быть удалены. (Примечание. Эти цифры предназначены для видимого в настоящее время с открытым исходным кодом и варьируются по выпуску Android).
Оставь AsyncTask
Только темы, пожалуйста.
Другие советы
В дополнение к ответу Согласие:
В настоящее время я использую Android 2.2, и мое приложение использует не более одной Asyncctask в любое время, но я создаю новый каждые X минут. Сначала начинает появляться новые нити Asyncctask (новая нить для новой асинктаки), но после 5 потоков (как упомянуто Commonsware), они просто остаются видны в окне отладки, и повторно используются, когда необходимы новые потоки Asynctask. Они просто остаются там, пока отладчик не отключится.
Так же симптом здесь. В моем случае темы повесили вокруг после того, как я убил деятельность, и я надеялся на приложение, чтобы закрыть полностью. Проблема частично решена с помощью одного резьбового исполнителя:
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
Это сделало нить, чтобы исчезнуть после завершения своей работы.
Использовать 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
задача, используя выполнять() метод.
void execute (Runnable command)
Выполняет данную задачу когда-нибудь в будущем. Задача может выполняться в новом потоке или в существующем объединенном потоке
Что касается вашего второго запроса:
Как я могу убить эти темы?
Как только вы закончите со всей вашей работой с ThreadPoolExecutor
, выключите его должным образом, как указаны ниже поста: