Android AsyncTask остается в рабочем состоянии после завершения
Во время работы над приложением я заметил, что количество потоков постоянно растет
Потоки AsyncTask по какой-либо причине остаются открытыми (я уверен, что они закончили работу и завершили), я понятия не имею, почему я продолжаю создавать больше потоков этого типа, и они продолжаются бесконечно.
есть ли способ проверить, что эти потоки прекращены при условии соответствия?
есть ли какие-либо известные проблемы с восстановлением потоков AsyncTasks?
При запуске:
public class DoNothingTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
}
я вижу в debbuger новый поток для каждого раза, когда я делаю new DoNothingTask().execute(null);
как folow
Thread[<ThreadNumber>AsyncTask#1](running)
мой вопрос, почему это? мое приложение полагается на выделение на AsyncTask, и я не могу создать новый поток и остаться в живых после каждой задачи.
Спасибо, Тотем
Ответы
Ответ 1
Я тоже ударился головой об этом, и просто наткнулся на этот ответ (ну, это скорее объяснение, чем ответ):
CommonsWare объясняет:
AsyncTask управляет пулом потоков, созданным с помощью ThreadPoolExecutor. Он будет иметь от 5 до 128 потоков. Если имеется более 5 потоков, эти дополнительные потоки будут удерживаться не более 10 секунд перед удалением. (обратите внимание: эти цифры для видимого в настоящее время кода с открытым исходным кодом и отличаются версией Android).
Оставьте только потоки AsyncTask.
Исходный вопрос:
Нити AsyncTask никогда не умирают
Ответ 2
Я не уверен, связано ли это, но я столкнулся с подобной проблемой и в одном из моих приложений.
У меня есть активность, которая инициализирует потоки TimerTask. Задачи выполняются должным образом с заданным интервалом, но после некоторого времени простоя количество этих потоков, по-видимому, увеличивается (показывая, что потоки остаются открытыми и создаются новые потоки). Проблема заключалась в динамической загрузке и разгрузке моего приложения с помощью Android VM. Исходные потоки, которые никогда не использовались, чтобы их убивали, как и при каждой новой загрузке приложения, выполнялась инициализация потока. Вот почему общее число потоков в моем приложении увеличилось.
Есть ли аналогичная реализация в вашем приложении.
Ответ 3
Вы должны использовать
thread.join
чтобы убедиться, что поток завершен. Вы делаете это?