Android: Это хорошая практика, чтобы получить контекст статически?
В настоящее время в моем приложении у меня есть следующий класс:
public class MyApp extends Application {
private static Context context;
public void onCreate(){
super.onCreate();
MyApp.context = getApplicationContext();
}
public static Context getContext() {
return MyApp.context;
}
}
Я использую это, чтобы иметь контекст в классах, которые не являются ни действиями, ни фрагментами. Там какая-либо разница между использованием контекста, хранящегося в этом классе, и использованием и деятельностью в качестве контекста? Хорошая практика заключается в том, чтобы этот класс или я должен предоставлять деятельность как контекст любому классу, который в нем нуждается?
Спасибо.
Ответы
Ответ 1
Есть ли какая-либо разница между использованием контекста, хранящегося в этом классе, и использованием и активностью в качестве контекста?
Да. Прочитайте эпическое сообщение в блоге Dave Smith. В итоге: используйте Application
, когда знаете , почему Application
- правильный ответ... и это редко бывает.
Хорошо, что этот класс
ИМХО, не обычно. Иногда вам может понадобиться объект Application
, но вам не нужен собственный пользовательский подкласс, и вам не нужно делать его одиночным.
должен ли я предоставлять действие как контекст любому классу, который нуждается в нем?
Вы предоставляете правильный экземпляр Context
для любого метода, который ему нужен. Как описывает Дэйв Смит в этом сообщении в блоге, не все экземпляры Context
создаются равными. Используйте Application
только тогда, когда Application
- это правильный тип Context
.
Ответ 2
Да, это прекрасно. Наличие статической ссылки на приложение Context
не вызовет утечки памяти. Этот Context
существует, пока процесс жив.
Ответ 3
Если вам нужно это сделать, я думаю, вам нужно переосмыслить свой дизайн. Вам не нужно использовать контекст (что я могу думать) за пределами Activity, Fragment, Service и т.д. Все должно основываться на базовых компонентах приложения, и вы должны иметь возможность соответствующим образом передавать Context без необходимости делать это. Например, вы можете вызвать getContext()
из Views, чтобы захватить его. Если вам нужно использовать его в POJO, он должен быть привязан к компоненту приложения и передать его через конструктор.
edit: Кажется, что с проблемой утечки памяти может возникнуть проблема? Я помню, как читал об изменениях ориентации экрана, разрушающих хаос, когда кто-то это делал. В любом случае, это не имеет большого смысла с точки зрения дизайна для меня.
edit2: Ребята, вы правы. Я неправильно помнил статью блога Романа об этом.