Sobes.tech
Back to questions
Junior — Middle
70

Как использование AsyncTask может привести к утечкам памяти в приложении?

Answer from AI

sobes.tech AI

AsyncTask в Android может привести к утечкам памяти, если он объявлен как внутренний (inner) класс Activity или другого компонента с жизненным циклом, и при этом продолжает работать после уничтожения Activity.

Причина в том, что AsyncTask содержит неявную ссылку на внешний класс (например, Activity). Если задача выполняется долго, а Activity уже уничтожена (например, при повороте экрана), то AsyncTask удерживает ссылку на Activity, не давая сборщику мусора освободить память.

Чтобы избежать утечек:

  • Делать AsyncTask статическим классом и использовать слабые ссылки (WeakReference) на Activity.
  • Отменять AsyncTask в методах жизненного цикла Activity (например, onDestroy).

Пример:

static class MyTask extends AsyncTask<Void, Void, Void> {
    private WeakReference<Activity> activityRef;

    MyTask(Activity activity) {
        activityRef = new WeakReference<>(activity);
    }

    @Override
    protected Void doInBackground(Void... voids) {
        // Долгая операция
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        Activity activity = activityRef.get();
        if (activity != null && !activity.isFinishing()) {
            // Обновить UI
        }
    }
}