Вопрос

я использую AsyncTasks для получения данных в ответ на пользователь нажав кнопку. Это хорошо работает и держит интерфейс отзывчив, привлекая данные, но когда я проверил, что происходит в отладчике 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, выключите его должным образом, как указаны ниже поста:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top