[Разработка под Android] Борьба за жизни переменных. Или как я попытался упростить жизнь Android разработчикам
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Была идея. Собрать в одно место группу важных переменных, чтобы вместе они стали чем-то большим. И когда понадобятся, могли использоваться тогда, когда программисту нужны значения не зависящие от жизненных циклов и высвобождения памяти свернутых приложений.
ИдеяИдея появилась из проблемы. Проблема появилась из негодования. Мне было жутко неприятно от мысли, что при повороте экрана приходится проделывать серьезную работу над тем, чтобы сохранить состояние экрана в том виде, каком оно было до поворота.
Но еще больше негодования у меня вызвала новость, что поворот экрана это не единственная причина, которая может мешать мне сохранять состояние в неизменном виде.
Я ранее слышал про то, что система подчищает ресурсы для чего-то, забивая на свернутые приложения, но когда я немного углубился в это, то очень сильно был огорчен. Именно из этого "негодования" у меня появилась проблема. Как мне сделать это красиво и не так болезненно?
И из этой проблемы появилась идея. Идея собрать все, что должно быть независимо от поворота экрана и высвобождения памяти, в одно место, чтобы я в этом месте был уверен на все сто процентов и всегда знал: Все, что я туда положил, там и останется в неизменном виде.
И не хотелось сильно размазывать код этими переменными...Каким образом решить эту задачу? Сразу вспоминаешь решения, которые уже есть: bundle и т.д.Но мне одному все эти решения кажутся неудобными? Мне одному кажется, что они выписываются из общего кода, когда начинаешь с ними работать?И тут я встал перед выбором, либо я делаю принципиально что-то новое, либо я делаю обертку чего-то, что уже придумано. Да такую обертку, чтобы с ней было удобней работать.
После анализа возможностей и моего знакомства с SavedStateHandle я загорелся желанием сделать обертку над ним и все это использовать в MVVM. Так и родилась библиотека которую сейчас Вы увидите.РеализацияНу тут все просто (имхо)Например, мы уже определились со скоупом наших значений, которые мы хотим хранить. Тогда просто создаем класс в котором просто декларируем их и помечаем этот класс аннотацией @UnkillableНапример вот так:
@Unkillable
data class SampleFragmentState(
val testValue: Double,
val testLiveData: MutableLiveData<Double>
) : EmptyState()
Также мы можем там указать и произвольные классы, но только они уже должны быть с Parcelize (Подробней).Таким образом должен выглядить ViewModel. Естественно, библиотека предлагает не только работу с AndroidViewModel, но и просто ViewModel.
class SampleViewModel(
application: Application,
savedStateHandle: SavedStateHandle
) : AndroidStateViewModel(application, savedStateHandle) {
override fun provideState() = createState<UnkillableSampleFragmentState>()
}
UnkillableSampleFragmentState сгенерируется у Вас сразу после запуска билда проекта. Естественно, наша ViewModel должна быть проинициализированна, но не совсем так как обычно. А так, как предлагает Google для использования SavedStateHandle.
activity?.application?.let { application ->
viewModel = ViewModelProvider(this, SavedStateViewModelFactory(application, this))
.get(SampleViewModel::class.java)
}
Это все. Теперь можно использовать по назначению! Просто записываем туда данные и достаем их. Отмечу, что для сохранения класса необходимо делать его @Parcelize (Подробнее тут).Вот таким образом можно воспользоваться библиотекой.
init {
// get values example
Log.d("StateLog", "0 value ${state.testValue}")
Log.d("StateLog", "1 value ${state.testLiveData?.value}")
}
fun onSetDataClicked() {
// set values example
state.testValue = 2.2
state.updateTestLiveDataValue(3.3) // yourLiveData.value = 3.3
state.postUpdateTestLiveDataValue(3.3) // yourLiveData.postValue(3.3)
}
Таким образом, мы защищаемся от подчистки приложения из памяти операционной системой.ИтогЦель данной библиотеки упростить разработку и разгрузить разработчика от написания кода, при условии, что он работает с сохранением состояния приложения. Также удалось очистить код от всех этих переменных, которые необходимо сохранить. К тому же теперь они логически отделены от общей массы и не засоряют код, что выглядит довольно приятно. Однако пока сейчас она работает только в MVVM от гугла.
GitHub
===========
Источник:
habr.com
===========
Похожие новости:
- [Информационная безопасность, Программирование, Разработка под Android] Android — запрещенные приемы
- [Разработка мобильных приложений, Разработка под Android] Материалы митапа для андроид-инженеров: поиск проблем сборки, защита от них и работа с Gradle
- [Разработка мобильных приложений, Функциональное программирование, Карьера в IT-индустрии, Конференции] Этот поезд в окне: анонс TechTrain 2021 Spring
- [Разработка под e-commerce, Брендинг, Бизнес-модели, Будущее здесь, IT-компании] Как строить процессы в компании, чтобы ваши клиенты были с вами навсегда
- [Системное администрирование, Программирование, Git, Разработка под Linux, DevOps] DevOps: автоматизация инфраструктуры на примере Terraform, docker, bash, prometheus exporters, Gitlab и WireGuard
- [Веб-дизайн, Разработка веб-сайтов, Интерфейсы, Usability, Дизайн] Метод Content Brick. Как создать структуру веб-сайта быстрее и проще чем это было раньше? (перевод)
- [Разработка веб-сайтов, Гаджеты, Старое железо, Лайфхаки для гиков] Вторая жизнь пыльного Андроида
- [Open source, Сетевые технологии, Mesh-сети, Разработка систем связи] Yggdrasil Network: Заря бытовых меш-сетей, или Интернет будущего
- [Разработка под Arduino, Производство и разработка электроники, DIY или Сделай сам] Маяк, ночник и конструктор для вашего ребенка (50 деталей, 3D печать)
- [*nix, Разработка под Linux, Интернет вещей, DIY или Сделай сам] Подключаем дисплей SPI LCD ILI9341 к одноплатному компьютеру Banana Pi BPI-M64 или любому другому на ОС Armbian
Теги для поиска: #_razrabotka_pod_android (Разработка под Android), #_android, #_mvvm, #_savedstatehandle, #_bundle, #_zhiznennyj_tsikl (Жизненный цикл), #_biblioteka (Библиотека), #_library, #_razrabotka (Разработка), #_razrabotka_pod_android (
Разработка под Android
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 22:23
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Была идея. Собрать в одно место группу важных переменных, чтобы вместе они стали чем-то большим. И когда понадобятся, могли использоваться тогда, когда программисту нужны значения не зависящие от жизненных циклов и высвобождения памяти свернутых приложений.
ИдеяИдея появилась из проблемы. Проблема появилась из негодования. Мне было жутко неприятно от мысли, что при повороте экрана приходится проделывать серьезную работу над тем, чтобы сохранить состояние экрана в том виде, каком оно было до поворота. Но еще больше негодования у меня вызвала новость, что поворот экрана это не единственная причина, которая может мешать мне сохранять состояние в неизменном виде. Я ранее слышал про то, что система подчищает ресурсы для чего-то, забивая на свернутые приложения, но когда я немного углубился в это, то очень сильно был огорчен. Именно из этого "негодования" у меня появилась проблема. Как мне сделать это красиво и не так болезненно? И из этой проблемы появилась идея. Идея собрать все, что должно быть независимо от поворота экрана и высвобождения памяти, в одно место, чтобы я в этом месте был уверен на все сто процентов и всегда знал: Все, что я туда положил, там и останется в неизменном виде. И не хотелось сильно размазывать код этими переменными...Каким образом решить эту задачу? Сразу вспоминаешь решения, которые уже есть: bundle и т.д.Но мне одному все эти решения кажутся неудобными? Мне одному кажется, что они выписываются из общего кода, когда начинаешь с ними работать?И тут я встал перед выбором, либо я делаю принципиально что-то новое, либо я делаю обертку чего-то, что уже придумано. Да такую обертку, чтобы с ней было удобней работать. После анализа возможностей и моего знакомства с SavedStateHandle я загорелся желанием сделать обертку над ним и все это использовать в MVVM. Так и родилась библиотека которую сейчас Вы увидите.РеализацияНу тут все просто (имхо)Например, мы уже определились со скоупом наших значений, которые мы хотим хранить. Тогда просто создаем класс в котором просто декларируем их и помечаем этот класс аннотацией @UnkillableНапример вот так: @Unkillable
data class SampleFragmentState( val testValue: Double, val testLiveData: MutableLiveData<Double> ) : EmptyState() class SampleViewModel(
application: Application, savedStateHandle: SavedStateHandle ) : AndroidStateViewModel(application, savedStateHandle) { override fun provideState() = createState<UnkillableSampleFragmentState>() } activity?.application?.let { application ->
viewModel = ViewModelProvider(this, SavedStateViewModelFactory(application, this)) .get(SampleViewModel::class.java) } init {
// get values example Log.d("StateLog", "0 value ${state.testValue}") Log.d("StateLog", "1 value ${state.testLiveData?.value}") } fun onSetDataClicked() { // set values example state.testValue = 2.2 state.updateTestLiveDataValue(3.3) // yourLiveData.value = 3.3 state.postUpdateTestLiveDataValue(3.3) // yourLiveData.postValue(3.3) } GitHub =========== Источник: habr.com =========== Похожие новости:
Разработка под Android ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 22:23
Часовой пояс: UTC + 5