Ответ
AsyncTask может вызывать утечки памяти, если его использовать неправильно. Основные причины:
-
Ссылка на Activity/Fragment: AsyncTask часто объявляется как внутренний класс и неявно хранит ссылку на внешний класс (Activity/Fragment). Если задача выполняется дольше, чем живет Activity (например, при повороте экрана), это может привести к утечке.
-
Неотмененные задачи: Если AsyncTask не отменять при уничтожении Activity, он продолжит работать в фоне, удерживая ссылку.
Пример утечки:
class MyActivity extends Activity {
void startTask() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
// Долгая операция
return null;
}
}.execute();
}
}
Решение:
- Использовать WeakReference для контекста
- Отменять задачу в onDestroy():
private AsyncTask task;
@Override
protected void onDestroy() {
if (task != null) {
task.cancel(true);
}
super.onDestroy();
}
Лучше использовать современные альтернативы: Coroutines, RxJava или Executors.