Как AsyncTask вызывает утечки памяти

«Как AsyncTask вызывает утечки памяти» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

AsyncTask может вызывать утечки памяти, если его использовать неправильно. Основные причины:

  1. Ссылка на Activity/Fragment: AsyncTask часто объявляется как внутренний класс и неявно хранит ссылку на внешний класс (Activity/Fragment). Если задача выполняется дольше, чем живет Activity (например, при повороте экрана), это может привести к утечке.

  2. Неотмененные задачи: Если 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.