Использование класса приложения Android для сохранения данных
Я работаю над довольно сложным приложением для Android, для которого требуется довольно большой объем данных о приложении (я бы сказал, всего около 500 КБ - это большое для мобильного устройства?). Из того, что я могу сказать, любое изменение ориентации в приложении (точнее, в активности) вызывает полное разрушение и воссоздание активности. Исходя из моих выводов, класс Application не имеет один и тот же жизненный цикл (т. Е. Он всегда создается для всех целей и задач). Имеет ли смысл хранить информацию о состоянии внутри класса приложения и затем ссылаться на нее из Activity, или это вообще не "приемлемый" метод из-за ограничений памяти на мобильных устройствах? Я очень ценю любые советы на эту тему. Спасибо!
6 ответов
Я не думаю, что 500kb будет такой большой сделки.
Что вы описали, так это то, как я решил проблему потери данных в деятельности. Я создал глобальный синглтон в классе Application и смог получить к нему доступ из действий, которые я использовал.
Вы можете передавать данные в Global Singleton, если они будут использоваться часто.
public class YourApplication extends Application
{
public SomeDataClass data = new SomeDataClass();
}
Затем позвоните в любой деятельности:
YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
Я обсуждаю это здесь, в своем блоге, в разделе "Глобальный синглтон".
Те, кто рассчитывает на Application
пример не прав. Сначала может показаться, что Application
существует до тех пор, пока существует весь процесс приложения, но это неверное предположение.
ОС может убивать процессы по мере необходимости. Все процессы разделены на 5 уровней "убиваемости", указанных в док.
Так, например, если ваше приложение работает в фоновом режиме из-за того, что пользователь отвечает на входящий вызов, то в зависимости от состояния оперативной памяти ОС может (или не может) уничтожить ваш процесс (уничтожив Application
экземпляр в процессе).
Я думаю, что лучшим подходом было бы сохранить ваши данные во внутреннем файле хранения и затем прочитать их, когда ваша деятельность возобновится.
ОБНОВИТЬ:
Я получил много отрицательных отзывов, так что пришло время добавить разъяснения.:) Ну, изначально я действительно использовал неверное предположение, что состояние действительно важно для приложения. Однако, если ваше приложение в порядке, что иногда состояние теряется (это могут быть некоторые изображения, которые будут просто перечитаны / перезагружены), тогда вполне нормально сохранить его в качестве члена Application
,
Если вы хотите получить доступ к "Global Singleton" за пределами действия, и вы не хотите передавать Context
через все задействованные объекты, чтобы получить синглтон, вы можете просто определить статический атрибут в своем классе приложения, который содержит ссылку на себя. Просто инициализируйте атрибут в onCreate()
метод.
Например:
public class ApplicationController extends Application {
private static ApplicationController _appCtrl;
public static ApplicationController getAppCtrl()
{
return _appCtrl;
}
}
Потому что подклассы Application
Также вы можете получить Ресурсы, вы можете получить к ним доступ просто, когда определите статический метод, который их возвращает, например:
public static Resources getAppResources()
{
return _appCtrl.getResources();
}
Но будьте очень осторожны при передаче ссылок на контекст, чтобы избежать утечек памяти.
Дэйв, что это за данные? Если это общие данные, которые относятся к приложению в целом (пример: пользовательские данные), то расширьте класс Application и сохраните его там. Если данные относятся к Activity, вы должны использовать обработчики onSaveInstanceState и onRestoreInstanceState, чтобы сохранить данные при повороте экрана.
Вы действительно можете переопределить функциональность ориентации, чтобы убедиться, что ваша деятельность не будет уничтожена и воссоздана. Посмотри здесь
Я знаю, что это очень старый вопрос, но использование ViewModel из компонентов реактивного ранца - лучший способ сохранить данные между ротацией Activity.
Класс ViewModel разработан для хранения данных, связанных с пользовательским интерфейсом, и управления ими с учетом жизненного цикла. Класс ViewModel позволяет данным сохраняться при изменении конфигурации, например, при повороте экрана.
Вы можете создать класс Application и сохранить все данные на этом уровне для использования в любом месте вашего приложения.