Подтвердить что ты не робот

Android: ссылки на утечку контекста и памяти

Я читал, что это ошибка и источник утечек памяти в приложении Android для сохранения долговечных ссылок на контекст.

Но я не понимаю, нормально ли создавать класс, похожий на этот:

public class HelperClass {
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }
    public void myHelperMethod() {
        // uses this.context
    }
}

И назовите это из Activity:

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        HelperClass h = new HelperClass(this);
        h.myHelperMethod();
    }

    ...
}
4b9b3361

Ответ 1

Это нормально и не вызовет утечку памяти.

Как только onCreate завершает выполнение, h будет недоступен и получит право на сбор мусора. Если h был статичным, тогда у вас возникнут проблемы. Только когда ссылка на контекст переживает жизненный цикл самого контекста, произойдет утечка памяти. Несколько полезных советов:

  • Используйте Context.getApplicationContext(), когда это возможно. Этот контекст будет жить до тех пор, пока ваше приложение будет жить.
  • Будьте осторожны при использовании статических полей и внутренних классов.
  • Запустите приложение через профайлер, чтобы проверить наличие утечек.

Ответ 2

Область действия HelperClass находится только внутри вашей функции onCreate, поэтому после выполнения executeCreate ваш объект "h" больше не нужен и может быть зависеть от сбора мусора.

Было бы иначе, если бы "h" был статическим членом - это был бы отличный способ утечки памяти.