Согласно Romain Guy такого рода код подвержен утечке памяти из-за того, чтоПочему ссылка на Контекст на утечку памяти?
.... взгляды имеют ссылку на всю деятельность и, следовательно, к чему ваша деятельность держит на; как правило, всю иерархию View и все ее ресурсы.
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
setContentView(label);
}
Я не ясно об этом.
Предполагая, что приложение имеет 1 активность, это самый длинный объект и может быть воссоздан по мере необходимости. Это означает, что все его поля экземпляров (которые могут и обычно равны View
) могут быть нулевыми в любое время.
И любое статическое поле экземпляра будет жить в течение той же продолжительности, что и сама деятельность.
Так как мы можем получить утечку памяти с кодом, как выше или следующее:
private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
Итак, у первого фрагмента нет утечки памяти? – Jim
@Jim: Правильно. Я предполагаю, что он должен проиллюстрировать предложение, непосредственно предшествующее фрагменту кода («Обычно это первый, который разработчик передает классам и методам, которым нужен контекст:»), показывая передачу «Контекста» в «TextView» конструктор. – CommonsWare