2010-07-27 2 views
25

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

Но я не понимаю, если это нормально, чтобы создать класс, который выглядит как этот:

public class HelperClass { 
    private Context context; 

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

И называют его от деятельности:

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

    ... 
} 

ответ

43

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

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

  • Использовать Context.getApplicationContext() если возможно. Этот контекст будет жить до тех пор, пока ваше приложение будет живым.
  • Будьте внимательны при использовании статических полей и внутренних классов.
  • Run your application through a profiler для проверки утечек.
+1

Что делать, если у вас есть приватная переменная с таким вспомогательным классом в вашей деятельности, которая содержит ссылку «Контекст»? – Peterdk

+2

@Peterdk, если ваша переменная содержит экземпляр контекста из getApplicationContext(), без проблем. Но если вы используете Контекст из Activity, позаботьтесь о утечке памяти (более корректно удерживая экземпляр от Activity больше, чем нужно). Возможно, вы должны использовать WeakReference для хранения экземпляра контекста Activity и использовать прослушиватель, чтобы узнать, когда ваше приложение изменилось на другую активность. – marciowb

6

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^