Чтение строк XML из статического контекста в Android
Быстрый ответ
Если требуется извлечь содержимое ресурса, прибегните к методу getResourceAsStream()
, применяемому в случае ClassLoader
:
InputStream stream = YourClass.class.getClassLoader().getResourceAsStream("путь/к/ресурсу");
Здесь YourClass
замените на имя вашего класса, а "путь/к/ресурсу" – на путь к нужному ресурсу. Результатом будет InputStream
, обеспечивающий доступ к данным ресурса.
Если же вам требуются ресурсы на Android без участия Activity
или Context
, обратите внимание на статический контекст приложения.
Визуализация
Вообразите автомат с закусками, и роботизированную руку, извлекающую из него лакомства. Истинная гиковская мечта.
public class ResourceVendingMachine {
public static InputStream getSnack(String path) {
return ResourceVendingMachine.class
.getResourceAsStream(path);
}
}
И вот прекрасное решение:
🤖 Автомат с закусками подготовлен: [🍫, 🍪, 🧃]
🦾 Робот-рука выполняет поиск закуски: getSnack("/snack.txt")
Мощь технического прогресса! Печенька извлечена роботизированной рукой из автомата!
Подкласс приложения: Ваша универсальная уловка в Android
Разработайте подкласс приложения Android:
public class MyApp extends Application { private static MyApp instance; @Override public void onCreate() { super.onCreate(); instance = this; } public static MyApp getInstance() { return instance; } }
В этом случае класс
MyApp
становится обладателем статического экземпляра приложения.Пропишите подкласс в
AndroidManifest.xml
:<application android:name=".MyApp" ...> </application>
Используйте статический метод для получения ресурсов:
public static String getStaticStringResource(int resId) { return MyApp.getInstance().getString(resId); }
Теперь вы – маг в мире ресурсов Android. Но помните о переполнении памяти и возможных архитектурных сложностях.
Используйте системные ресурсы, как профессионал!
Для доступа к системным ресурсам Android применяйте Resources.getSystem()
:
String cancel = Resources.getSystem().getString(android.R.string.cancel);
Этот метод подойдет исключительно для системных ресурсов.
Ситуации, когда статический контекст может оказаться недостаточным
Статический контекст может быть рискованным:
- Утечка памяти: Статический контекст может привести к утечкам памяти.
- Жизненный цикл: Он не ведает о жизненном цикле Activity или Fragment.
- Квалификаторы ресурсов: Предполагаемые квалификаторы ресурсов, например, локаль или размер экрана, могут быть не распознаны.
Отдаём должное ветеранам: Свойства и Наборы Ресурсов
Доступ к свойствам и ресурсам в Java может казаться устаревшим, однако он весьма эффективен:
Properties props = new Properties();
try (InputStream input = ClassName.class.getClassLoader().getResourceAsStream("config.properties")) {
props.load(input);
}
String value = props.getProperty("key");
Для локализации прибегайте к наборам ресурсов:
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", Locale.US);
String greeting = messages.getString("greeting");
Такие подходы могут оказаться полезными в случаях, когда отсутствует Context
.
Полезные материалы
- Class (Java Platform SE 8 ) — описание
Class
от Oracle. - ClassLoader (Java Platform SE 8 ) — подробности о работе ClassLoader.
- Properties (Java Platform SE 8 ) — информация о
Properties
. - Java Practices->Tag or marker interfaces — введение в ресурсы Java.
- DZone – Java Basics: Resource Loading — загрузка ресурсов в Java.