Я использую AsyncTask
s для получения данных в ответ на нажатие кнопки пользователем. Это работает хорошо и поддерживает отзывчивость интерфейса при извлечении данных, но когда я проверил, что происходит в отладчике Eclipse, я обнаружил, что каждый раз при создании нового AsyncTask
(что довольно часто, потому что их можно использовать только один раз) ), новый поток создавался, но никогда не завершался.
В результате большое количество AsyncTask
потоков просто сидит там. Я не уверен, является ли это проблемой на практике или нет, но мне бы очень хотелось избавиться от этих лишних потоков.
Как я могу убить эти темы?
android
multithreading
android-asynctask
Компьютерный
источник
источник
doInBackground
Метод завершается, но поток продолжает отображаться в окне отладки. Например:Thread [<23> AsyncTask #4](Running)
Ответы:
AsyncTask
управляет пулом потоков, созданным с помощьюThreadPoolExecutor
. В нем будет от 5 до 128 потоков. Если потоков больше 5, эти дополнительные потоки будут оставаться не более 10 секунд, прежде чем будут удалены. (примечание: эти цифры относятся к видимому в настоящее время открытому исходному коду и зависят от версии Android).Оставьте
AsyncTask
темы в покое, пожалуйста.источник
AsyncTask
для чего-то, что займет так много времени, - вообще плохая идея. Но нет, мой комментарий о том, что лишние потоки исчезают, когда они не используются. Итак, когда одна из ваших 6 задач завершится, ее поток останется в пуле в течение 10 секунд, после чего этот поток будет завершен.AsyncTask
сегодняшнего дня - не лучший план. Наличие 20+, которые могут работать в течение 10+ секунд, - это то, что должно провалить проверку кода. Если вы создадите 20 задач в быстрой последовательности, только несколько будут выполняться одновременно, а остальные будут поставлены в очередь для последующего выполнения. Сколько будет запускаться одновременно, зависит от количества ядер ЦП. AFAIK, текущий алгоритм - это 2N + 1 параллельных потоков, где N - количество ядер.В дополнение к ответу CommonsWare:
В настоящее время я использую Android 2.2, и мое приложение одновременно использует не более одной AsyncTask, но я создаю новую каждые x минут. Сначала начинают появляться новые потоки AsyncTask (новый поток для нового AsyncTask), но после 5 потоков (как указано CommonsWare) они просто остаются видимыми в окне отладки и повторно используются, когда требуются новые потоки AsyncTask. Они просто остаются там, пока отладчик не отключится.
источник
Здесь тот же симптом. В моем случае потоки зависли после того, как я убил Activity, и я надеялся, что приложение полностью закроется. Проблема частично решена за счет использования однопоточного исполнителя:
Это заставляло нить исчезать после завершения своей работы.
источник
Используйте ThreadPoolExecutor .
Опубликуйте свою
Runnable
задачу с помощью метода execute () .Что касается вашего второго запроса:
Как только вы закончите свою работу
ThreadPoolExecutor
, выключите его должным образом, как указано в сообщении ниже:Как правильно завершить работу java ExecutorService
источник