2014-10-03 1 views
1

В моем последнем проекте в действиях у меня было много MyActivity.this, предоставляемых для методов, требующих контекста, поэтому я решил сделать это так в начале классаЯвляется ли хорошей практикой объявлять контекст в начале деятельности

private Context context = ActivityStage2.this; 

, а затем просто передать context методам объекта. Пока это работает нормально, но нормально ли вообще объявлять контекст? Я имею в виду, что всегда есть обновленное состояние MyActivity.это каждый раз, когда ссылается на объект контекста?

+1

Лучше б 'Application Level context' –

+0

Я использую' getApplicationContext() ', вместо' this' –

+1

Если вы работаете внутри используйте это, иначе используйте getApplicationContext() – zozelfelfo

ответ

4
  • Вы можете сделать это, но в этом нет никакого смысла.

Вы в основном «кешируете» ссылку this на поле. Инициализация поля будет выполняться непосредственно перед телом конструктора, поэтому каждый раз, когда объект воссоздается, ссылка context будет обновлена. Это работает аналогично this, который указывает на этот экземпляр объекта.

Теперь, зачем вы это делаете? Читаемость? Похоже, вы хотите использовать его во внутренних классах, потому что вы явно квалифицируете его с помощью: ActivityStage2.this. Программисты хорошо понимают метод java, чтобы квалифицировать внешнюю ссылку класса из внутреннего класса, и здесь выигрыш мало. Одним из исключений могут быть анонимные внутренние классы, в которых у вас нет имени внутреннего класса. В этом случае кеширование ссылки на Activity имеет смысл, но я предпочел бы использовать конечную локальную переменную вместо поля.

Другой причиной для этого может быть то, что вам нужен только интерфейс Context, а не интерфейс ActivityStage2: это теоретически теоретически, но на практике я бы не стал делать это без какой-либо другой причины.

Последняя вещь: если вы включите поле в статический один, вы действительно утечки.

+0

так что в работе я должен использовать «это»? –

+0

В принципе, да. –

+0

, поэтому, если я нахожусь в действии, я всегда должен использовать «это», а когда внешняя активность использует переданный «контекст» или «context.getApplicationContext()»? –

0

Там нет никаких проблем, чтобы сделать это, если следовать двум правилам, перечисленные ниже:

  1. сохранить ссылку на член экземпляра. Если вы используете статическое поле, ваш экземпляр Activity никогда не может быть переработан GC, потому что ваш класс имеет сильную ссылку на объект. Если вам действительно нужно это сделать, используйте WeakReference.

  2. Держите ссылку на свой пример Activity. Не держите ссылку на другую деятельность по причинам, которые я только что описал выше.

В противном случае все зависит от вас и вашего стиля кода :)