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();
}
...
}
Ответы
Ответ 1
Это нормально и не вызовет утечку памяти.
Как только onCreate
завершает выполнение, h
будет недоступен и получит право на сбор мусора. Если h
был статичным, тогда у вас возникнут проблемы. Только когда ссылка на контекст переживает жизненный цикл самого контекста, произойдет утечка памяти. Несколько полезных советов:
- Используйте
Context.getApplicationContext()
, когда это возможно. Этот контекст будет жить до тех пор, пока ваше приложение будет жить.
- Будьте осторожны при использовании статических полей и внутренних классов.
- Запустите приложение через профайлер, чтобы проверить наличие утечек.
Ответ 2
Область действия HelperClass находится только внутри вашей функции onCreate, поэтому после выполнения executeCreate ваш объект "h" больше не нужен и может быть зависеть от сбора мусора.
Было бы иначе, если бы "h" был статическим членом - это был бы отличный способ утечки памяти.