Нужно ли мне действительно передавать экземпляры контекста в приложение?

Где-то в приложении мне нужно получить локализованную строку, используя метод getString для сообщения об ошибке. Для этого мне нужен экземпляр контекста, полученный от, например, Activity. Действительно ли это так спроектировано? Действительно ли я вынужден передавать эти объекты в классы и методы или мне не хватает точки, и есть ли другой способ получить ссылку на строку?

Чтобы уточнить, в Управлении у меня есть внутренний подкласс AsyncTask, который в doInBackground создает новый класс для некоторой короткой сетевой обработки вне потока пользовательского интерфейса. Я хочу, чтобы сообщения об ошибках были локализованы, и для этого мне нужно передать экземпляр Context (другими словами, Activity) в этот класс. Дизайн получения значений ресурсов из XML файлов просто кажется немного неинтуитивным. Это заставляет меня задаться вопросом, почему это связано с экземплярами Context, а не с чем-то статическим или - простите меня - singleton, поскольку Context подразумевает глобальный контекст приложения, а не только его часть как Activity.

Ответ 1

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

Большая опасность не следовать этому заключается в том, что вы передаете ссылку на контекст активности куда-нибудь глубже в свой код, и ваша деятельность уничтожается, а ссылка, которую вы держите, по-прежнему находится в области видимости. Вы просто пропустили свою деятельность и все, на что она ссылается. Я бы рекомендовал не передавать контекст активности вне своей деятельности, если это действительно важно и даже тогда, быть уверенным в том, чтобы контролировать это время жизни.

Таким образом, это контекст необходим для чего-то, что не связано с пользовательским интерфейсом, например, о необходимости получить строковый ресурс, а затем использовать контекст приложения. Внутри действия и где ссылка на строку объявляется в действии, использование контекста активности будет приемлемым и, на мой взгляд, предпочтительным, поскольку вы принимаете сознательное решение относительно объема и времени жизни.

Тем не менее, вы должны спросить, лучше ли этот конкретный метод помещается в действие. Возможно, это не так, но спросите себя.

Наконец, небольшая педантичная точка. Вы не пропускаете объекты в любом месте. Вы передаете ссылку, фактически значение ссылки на объект. Все в Java передается по значению.

Ответ 2

Вы всегда можете расширить класс приложения. Создайте статический метод для getInstace(), чтобы получить контекст.